Apache ReWrite Condition Pensa que um diretório não é um diretório?

1

No meu servidor (Apache2, Ubuntu 10.04), wpsa é um diretório no meu webroot. Ao acessar o url mysite.com/wpsa, um ReWriteRule que não deve ocorrer quando o arquivo solicitado é um diretório, é executado de qualquer maneira.

Estas são as minhas regras:

RewriteCond %{REQUEST_URI} !^/index.php$ 
RewriteCond %{REQUEST_URI} !^/$ 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /000_ROUTE.php [L]

Isso é do registro de regravação:

applying pattern '.*' to uri '/wpsa/'
RewriteCond: input='/wpsa/' pattern='!^/index.php$' => matched
RewriteCond: input='/wpsa/' pattern='!^/$' => matched
RewriteCond: input='/wpsa/' pattern='!-f' => matched
RewriteCond: input='/wpsa/' pattern='!-d' => matched
rewrite '/wpsa/' -> '/000_ROUTE.php'
local path result: /000_ROUTE.php

Ele diz: "O 'wpsa' é um drietor?" - > "Não, não é". Mas realmente é. Por que acha que meu diretório não é um diretório?

Se eu adicionar:

ReWriteRule ^/wpsa - [L,NC]

antes desta regra, carrega o diretório. Mas eu não deveria ter que criar uma regra que não faça nada para cada diretório, deveria? É para isso que servem as condições -f / -d.

    
por Nick 05.12.2012 / 14:48

1 resposta

2

Sua webroot não é / (certo?), portanto, é correto que -d não tenha sido atingido. Ele está tentando corresponder /wpsa/ ao sistema de arquivos, literalmente - não em relação à webroot.

A razão pela qual você está fornecendo /wpsa/ como sua entrada de string em vez de /path/to/webroot/wpsa , o que funcionaria como esperado, é que você está usando %{REQUEST_FILENAME} no contexto errado.

Quando %{REQUEST_FILENAME} é usado em um contexto em que o mapeamento do sistema de arquivos já está pronto, como em um bloco <Directory> ou .htaccess , o caminho completo é retornado e -d funcionará como você espera.

dos documentos :

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.

Parece que você está usando em um contexto <VirtualHost> ou <Location> , o que o torna funcionalmente idêntico a %{REQUEST_URI} . Se você quiser mantê-lo nesse contexto, tente:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
    
por 06.12.2012 / 08:29