A primeira solicitação é processada e o URL é reescrito. Isso resulta em uma nova solicitação para o novo URL. Sem alguma forma de filtrar as solicitações (veja a resposta de Devin), o que você está vendo é o comportamento correto.
Eu entendo, tanto quanto o que está acontecendo com o meu código, porque estou obtendo um loop infinito. Então eu tenho o seguinte:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^foo/?([^/]+)?/?(.+)? /foo.php?bar=$1&baz=$2 [L,NC]
</IfModule>
Então, o que está acontecendo é que o usuário está chegando em foo
(ou foo/a/b
) e sendo redirecionado para foo.php?bar=$1&baz=$2
. Mas neste momento (e é aí que eu sei que preciso de uma explicação mais completa, já que tenho certeza que é por design) o arquivo .htaccess está sendo reexecutado em foo.php?bar=$1&baz=$2
, que corresponde à minha regra e entra em um infinito loop. Mas eu não sei por que isso está sendo reexaminado pelas minhas regras.
O que é que eu não entendo sobre o .htaccess RewriteRule
s?
PS: Eu resolvi esse problema imediato colocando os seguintes comandos antes da regra, mas gostaria de saber por que posso resolver o problema no futuro (e assim posso remover essas linhas e fazer outras coisas). / p>
RewriteCondition %{REQUEST_FILENAME} !-f
RewriteCondition %{REQUEST_FILENAME} !-d
É comum precisar de um RewriteCond antes de um RewriteRule, para não corresponder ao URL reescrito e evitar um loop infinito. Esse é um dos usos mais comuns do RewriteCond. Você deve se sentir bem em descobrir isso, e não sentir que está fazendo algo errado ao usá-lo dessa maneira.