Diretório “privado” não acessível no Apache

Diretório “privado” não acessível no Apache

O diretório privatefica em meu DocumentRoot e, apesar do nome, deve estar acessível como qualquer outro diretório. Mas se eu adicionar o seguinte RewriteRuleao 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 privatepara fooou 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 privateespecial, 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 privateem 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.htmlnão é afetada pelo RewriteRule, o padrão acima deve ser esperado.

A solução foi adicionar a bandeira[PT](passagem) para meu RewriteRule.

informação relacionada