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.