mod_rewrite REQUEST_FILENAME não contém caminho absoluto

7

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 .

Configuração

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]

Diagnóstico tentado

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

Regravar o rastreio de log

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 ...

    
por Paul Dixon 25.10.2009 / 19:26

3 respostas

1

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
    
por 25.10.2009 / 19:43
3

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).

    
por 10.10.2012 / 20:53
0
RewriteCond     %{REQUEST_URI}     ^(/pathinfo/|/pathinfo)(.*)$
RewriteRule     .*          %{DOCUMENT_ROOT}%{REQUEST_URI} [L]
    
por 08.06.2010 / 03:48