RewriteRules não parando com a bandeira LAST?

3

Parece que estou tendo problemas com o módulo Rewrite do Apache 2.2 (rodando no FreeBSD 8). Meu arquivo .htaccess é o seguinte:

Options -Indexes

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L] 

No entanto, de alguma forma, a última regra anula as outras três. Assim que eu comentar, as outras regras funcionam como esperado:

www.mysite.com/xpaste abre "cross.php"
www.mysite.com/x132633 abre "cross.php? id = 132633"
www.mysite.com/gen abre "index.php? gen"

Eu tentei várias combinações de sinalizadores L, NS e S = n em cada RewriteRule, mas a menos que eu comente a última regra, tudo será direcionado para index.php. Como faço o Apache parar de processar o RewriteRules assim que ele encontrar uma correspondência?

    
por Doktor J 01.03.2011 / 22:29

2 respostas

5

RewriteRule gera um REDIRECT INTERNO e processa para ser repetido a partir do primeiro RewriteRule (RewriteRule ^ xpaste $ cross.php [L]). Você precisa adicionar RewriteCond antes da última RewriteRule:

 RewriteEngine on
 RewriteRule ^xpaste$ cross.php [L]
 RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
 RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
 RewriteCond %{REQUEST_URI} !^/(cross|index)\.php$
 RewriteRule ^(.*)$ index.php [L]
    
por 01.03.2011 / 23:17
0

NS na última regra deveria ter funcionado. Também poderia fazer isso nas outras regras, sem danos. Estou chegando onde estou fazendo '[L, NS]', adicionando um NS sempre que houver um L.

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L,NS] 

Eu ainda não testei isso, mas também há uma abordagem interessante aqui, para sua solução mais genérica, usando uma variável IS_SUBREQ. link

Esta postagem menciona a variável REDIRECT_STATUS também. link

    
por 20.08.2012 / 17:26