Um RewriteCond para múltiplos RewriteRules

3

Eu preciso preservar todas as strings de consulta do usuário.

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^$ index.html?page=home&%1

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^about$ index.html?page=about&%1

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^contact$ index.html?page=contact&%1

Como posso especificar o RewriteCond para todas as RewriteRules?

Eu não estou ansioso para o único e versátil controlador RewriteRule, já que este é um pequeno site estático.

    
por MotionGrafika 21.07.2010 / 12:57

2 respostas

4

Para seus três exemplos, eles funcionarão:

RewriteRule ^$ index.html?page=home [QSA,L]
RewriteRule ^about$ index.html?page=about [QSA,L]
RewriteRule ^contact$ index.html?page=contact [QSA,L]

O truque é o sinalizador "QSA".

edit: uma solução um pouco mais geral, baseada em como o Drupal faz isso:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.html?page=$1 [L,QSA]

O! -f é importante, porque senão você não poderia servir imagens ou o próprio index.html. A linha! -D pode ser descartada, dependendo do que, exatamente, você está fazendo. Uma abordagem ligeiramente diferente pode ser:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ index.html?page=$1 [L,QSA]

que pegaria / foo e / bar, mas não / foo /, / bar /, ou / foo / bar.

    
por 21.07.2010 / 13:33
3

Além do fato de que você pode usar o QSA, você sabe que pode usar %{QUERY_STRING} dentro de sua RewriteRule?:

RewriteRule ^$ index.html?page=home&%{QUERY_STRING}
RewriteRule ^about$ index.html?page=about&%{QUERY_STRING}
RewriteRule ^contact$ index.html?page=contact&%{QUERY_STRING}

A vantagem desse método sobre o sinalizador QSA é que você pode controlar a ordem dos parâmetros na string de consulta resultante. Por exemplo:

    RewriteRule ^contact$ index.html?%{QUERY_STRING}&page=contact

Isso garante que o parâmetro 'page' esteja sempre definido como 'contact', mesmo que já esteja contido na string de consulta original. (Pelo menos, isso é verdade para o PHP, pois o analisador querystring do PHP sempre retorna o último dos vários parâmetros idênticos para o array $ _GET.)

Um RewriteCond para várias RewriteRules

Seu título implica outra pergunta que pode ser resolvida também:

Você pode usar o sinalizador RewriteRule S|skip para associar múltiplos RewriteRules a um único RewriteCond (ou a um conjunto de RewriteConds). Aqui está um exemplo que aplica um Cond a três regras:

RewriteCond  %{HTTP_HOST}  !^www.mydomain.com$  [NC]
# skip rules if NOT within domain - only way to tie multiple rules to one cond
RewriteRule  .?  -  [S=3]
RewriteRule  ^path1(/.*)$  /otherpath1$1
RewriteRule  ^path2(/.*)$  /otherpath2$1
RewriteRule  ^path3(/.*)$  /otherpath3$1

Mas esta não é uma solução para o seu problema original, já que as referências anteriores ao RewriteCond (como% 1 no seu caso) não funcionarão dentro das regras ignoradas.

    
por 19.12.2012 / 12:57