O diretório private
fica em meu DocumentRoot e, apesar do nome, deve estar acessível como qualquer outro diretório. Mas se eu adicionar o seguinte RewriteRule
ao httpd.conf:
RewriteRule ^/([^\.]+)$ /$1.html [L]
Apache retorna 403 parahttp://servidor/privado/2201. O log de erros indica
client denied by server configuration: /private/2201.html
Se eu renomear private
para foo
ou se solicitar 2201.html diretamente, o arquivo será veiculado:
127.0.0.1 - - [21/Nov/2011:10:24:45 +0100] "GET /private/2201 HTTP/1.1" 403 214
127.0.0.1 - - [21/Nov/2011:10:24:58 +0100] "GET /foo/2201 HTTP/1.1" 200 3068
127.0.0.1 - - [21/Nov/2011:10:27:39 +0100] "GET /private/2201.html HTTP/1.1" 200 3068
Isso é confuso. Existe alguma regra especial para diretórios nomeados private
? Se sim, por que a solicitação direta para 2201.html funciona (embora a solicitação negada pareça lidar com o mesmo recurso, pelo menos de acordo com a entrada do log de erros)?
Responder1
Não há nada embutido no Apache ou mod_rewrite que torne o nome private
especial, AFAIK. Porém, sua configuração pode ter vindo com uma regra padrão que trata esse nome de maneira diferente. Tente usar grep na sua configuração para a palavra private
, por exemplo
grep private /etc/httpd/httpd.conf # RedHat, CentOS
grep -r private /etc/apache2 # Debian, Ubuntu, etc.
Se você encontrar um RewriteRule correspondente, o culpado é esse.
Suas entradas de log deixam claro que é o nome private
em particular que está causando o problema e que deve ser um RewriteRule que está causando a negação da solicitação.
Responder2
Este é um caso embaraçoso de RTM. Documentação do Apache sobreRewriteRuleafirma explicitamente que as strings de substituição "serão tratadas como um caminho de URL, a menos que exista um diretório chamado www na raiz ou em seu sistema de arquivos, caso em que será tratado como um caminho do sistema de arquivos", pelo menos ao definir um RewriteRule fora de um contexto de diretório.
Como meu sistema de arquivos contém /private
, mas não /foo
, e a URL /private/2212.html
não é afetada pelo RewriteRule, o padrão acima deve ser esperado.
A solução foi adicionar a bandeira[PT](passagem) para meu RewriteRule.