Eu resolvi isso escrevendo explicitamente a raiz do documento na condição
RewriteCond /path/to/my/public_html%{REQUEST_FILENAME} !-f
RewriteCond /path/to/my/public_html%{REQUEST_FILENAME} !-d
Eu tenho um problema com uma operação de teste de arquivo em uma entrada mod_rewrite RewriteCond que está testando se %{REQUEST_FILENAME}
existe. Parece que, em vez de %{REQUEST_FILENAME}
ser um caminho absoluto, estou recebendo um caminho que está enraizado no DocumentRoot
.
Eu tenho isso dentro de um bloco <VirtualHost>
em minha configuração do Apache 2.2.9:
RewriteEngine on
RewriteLog /tmp/rewrite.log
RewriteLogLevel 5
#push virtually everything through our dispatcher script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([^/]*)/?([^/]*) /dispatch.php?_c=$1&_m=$2 [qsa,L]
Essa regra é uma linguagem bastante comum para rotear solicitações de arquivos ou diretórios inexistentes por meio de um script. O problema é que ele está disparando mesmo que exista um arquivo .
Se eu remover a regra, posso solicitar arquivos normais bem. Mas com a regra em vigor, esses pedidos são direcionados para o dispatch.php
Veja o que eu vejo no rewrite.log
init rewrite engine with requested uri /test.txt
applying pattern '^/([^/]*)/?([^/]*)' to uri '/test.txt'
RewriteCond: input='/test.txt' pattern='!-f' => matched
RewriteCond: input='/test.txt' pattern='!-d' => matched
rewrite '/test.txt' -> '/dispatch.php?_c=test.txt&_m='
split uri=/dispatch.php?_c=test.txt&_m= -> uri=/dispatch.php, args=_c=test.txt&_m=
local path result: /dispatch.php
prefixed with document_root to /path/to/my/public_html/dispatch.php
go-ahead with /path/to/my/public_html/dispatch.php [OK]
Então, parece que o REQUEST_FILENAME está sendo apresentado como um caminho a partir da raiz do documento, em vez da raiz do sistema de arquivos, o que é presumivelmente porque o operador de teste de arquivo falha.
Todos os ponteiros para resolver isso são recebidos com gratidão ...
Demorou um pouco para descobrir também, mas a razão é mencionada na documentação do mod_rewrite :
" REQUEST_FILENAME
O caminho completo do sistema de arquivos local para o arquivo ou script que corresponde à solicitação, se isso já tiver sido determinado pelo servidor no momento em que REQUEST_FILENAME
é referenciado. Caso contrário, como quando usado em contexto de host virtual , o mesmo valor que REQUEST_URI
. "
É por isso que funciona em .htaccess
, mas não no arquivo conf do vhost. (E também é por isso que adicionar o DOCUMENT_ROOT funciona em torno do problema).
RewriteCond %{REQUEST_URI} ^(/pathinfo/|/pathinfo)(.*)$
RewriteRule .* %{DOCUMENT_ROOT}%{REQUEST_URI} [L]
Tags mod-rewrite apache-2.2