Como evitar que o apache reinicie o processamento de reescrita dentro de um “contexto de diretório”

1

Eu tenho o seguinte no meu virtualhost para conexões SSL (meu host virtual não ssl parece o mesmo, mas sem o primeiro conjunto de regras para redirecionamento).

DocumentRoot /var/www/example.com/public/
<Directory "/var/www/example.com/public/">
  #only mod_rewrite configuration is shown here

  RewriteEngine on
  RewriteBase /

  RewriteCond $1 !=signup
  RewriteCond $1 !=login
  RewriteCond $1 !=welcome
  RewriteCond $1 !=thankyou
  RewriteRule ^(.*)$ http://example.com/$1 [L,R,QSA]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.+)$ index.php?q=$1 [L,QSA]
</Directory>

Minha intenção é que qualquer solicitação de página que não corresponda (signup | login | welcome | thankyou) seja redirecionada para o host virtual não ssl sem processamento adicional, caso contrário, não redirecione, mas processe a solicitação dentro do host virtual SSL.

O primeiro conjunto RewriteRule cuida do redirecionamento, enquanto o segundo conjunto RewriteRule cuida do processamento normal da página.

Sem o primeiro conjunto de regras, todas as solicitações são carregadas corretamente no host virtual SSL.

Com o primeiro conjunto de regras, os redirecionamentos funcionam muito bem e não correspondem aos recursos listados. por exemplo. um pedido para

https://example.com/about

redireciona para

http://example.com/about

Mas ao solicitar as páginas de inscrição, login, boas-vindas e agradecimento, o problema ocorre. Essas solicitações também são redirecionadas para o site não ssl, mas de maneira interrompida. Um pedido para

https://example.com/signup

redireciona para

http://example.com/index.php?q=signup

Parece que o primeiro conjunto de regras é inigualável (como seria de se esperar), depois que o segundo conjunto de regras é processado, o primeiro conjunto de regras é aplicado novamente (não esperado).

Não consigo corresponder esse comportamento inesperado a nenhuma funcionalidade documentada.

Alguma idéia?

Editar

Eu encontrei algumas referências obscuras na documentação para que o apache execute novamente as regras quando uma correspondência de regra ocorre dentro de um "contexto de diretório", no entanto, a referência foi em relação ao .htaccess. Minha reescrita está ocorrendo dentro de um diretório < Directory > tag no meu < VirtualHost > tag. No momento, estou testando a mudança da reescrita para fora do diretório < Directory > contexto - isso certamente parece mudar o comportamento, mas eu ainda não fiz o trabalho como eu preciso.

Edit2

O problema é certamente causado pelo reinício do processo de reconfiguração do apache quando o processamento de regras existe em um contexto de diretório. Mudei o processamento da regra para fora do diretório < Directory > tag. No entanto, agora as linhas RewriteCond não funcionam ... por exemplo.

RewriteCond %{REQUEST_FILENAME} -f

porque o apache ainda não resolveu o recurso solicitado para um mapeamento de arquivo usando o DocumentRoot. Que bagunça.

Então, prefixo manualmente o valor especificado no DocumentRoot para o RewriteCond. No entanto, isso parece um hack pobre. por exemplo.

RewriteCond /var/www/example.com/public%{REQUEST_FILENAME} -f

Então, agora estou procurando uma maneira de evitar que o apache reinicie o processo de reconfiguração quando estiver em um contexto de diretório ou, segundo melhor, uma maneira melhor de especificar os RewriteConds necessários no < VirtualHost > nível.

    
por chris 28.01.2010 / 07:21

2 respostas

0

Eu resolvi a seguinte solução, colocando as reescritas fora de qualquer < Diretório ... > Seções. Isso me permite redirecionar qualquer solicitação que não seja SSL para o site não SSL e, ao mesmo tempo, permitir que qualquer conteúdo estático seja veiculado por SSL (imagens, css, js etc).

<VirtualHost ...>
  ...
  RewriteEngine on

  RewriteCond $1 !=signup
  RewriteCond $1 !=login
  RewriteCond $1 !=welcome
  RewriteCond $1 !=thankyou
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
  RewriteRule ^/(.*)$ http://example.com/$1 [R=303,QSA,L]

  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteCond %{REQUEST_URI} !=/robots.txt
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
  RewriteRule ^/(.+)$ /index.php?q=$1 [QSA,L]
  ...
</VirtualHost>
    
por 30.01.2010 / 10:53
1

Sugiro adicionar o seguinte à sua configuração, que lhe dará um registro detalhado do que o mod_rewrite está fazendo e por quê. Isso pode ajudar a esclarecer por que você tem esse comportamento:

RewriteLog /tmp/rewrite.log
RewriteLogLevel 9

Quando terminar de analisar isso, remova essas linhas, pois elas afetam o desempenho.

    
por 28.01.2010 / 09:39