Compreendendo o RewriteCond em arquivos .htacces

1

Estou com problemas para entender como funciona a diretiva RewriteCond. Até agora, é bem claro que se compara a strings para aplicar um RewriteRule. Eu tenho este arquivo:

<IfModule rewrite_module>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app_dev.php
</IfModule>

Isso funciona para mim, mas não sei por que funciona. Até agora, na diretiva RewriteCond, eu entendo:

if the value of REQUEST_FILENAME is NOT a file in the hard drive then allow the rule

Isso não faz sentido porque app_dev.php depois de substituir é um arquivo no disco rígido. De qualquer forma, alguém poderia me esclarecer com esse problema? Estou tendo um tempo muito difícil para descobrir como isso funciona.

    
por Paulo Bu 01.06.2012 / 23:32

2 respostas

2

Se você solicitou /styles/main.css , então seria um arquivo no sistema de arquivos e o RewriteRule não seria processado. O Apache simplesmente serviria o arquivo.

Se você solicitar /foo/bar e isso não existir, o RewriteRule será processado e a solicitação se tornará /app_dev.php , no entanto, o PHP ainda terá acesso à URL original, antes da reescrita ocorrer. Usando isso, um framework como o symfony pode servir páginas diferentes para URLs diferentes, mesmo que o arquivo PHP seja o mesmo todas as vezes.

    
por 02.06.2012 / 00:39
1

É o caminho real do arquivo em seu sistema de arquivos real.

Portanto, se o DocumentRoot for /var/www e você solicitar /styles/main.css , quando usado no contexto de diretório / htaccess %{REQUEST_FILENAME} será /var/www/styles/main.css - e o !-f verificará se esse arquivo existe e permitindo que o RewriteRule ocorre se não existir.

Note que ele se comporta de maneira diferente e não terá a raiz do documento incluída se não for usada em um contexto de diretório / htaccess, como explicado no documentação :

REQUEST_FILENAME

The full local filesystem path to the file or script matching the request, if this has already been determined by the server at the time REQUEST_FILENAME is referenced. Otherwise, such as when used in virtual host context, the same value as REQUEST_URI.

    
por 02.06.2012 / 02:43