Directorio "privado" no accesible en Apache

Directorio "privado" no accesible en Apache

El directorio privatese encuentra bajo mi DocumentRoot y, a pesar de su nombre, debería ser accesible como cualquier otro directorio. Pero si agrego lo siguiente RewriteRulea httpd.conf:

RewriteRule ^/([^\.]+)$ /$1.html [L]

Apache devuelve 403 parahttp://servidor/privado/2201. El registro de errores indica

client denied by server configuration: /private/2201.html

Si luego cambio el nombre privatea foo, o si solicito 2201.html directamente, el archivo se entrega:

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

Esto es confuso. ¿Existe alguna regla especial para los directorios nombrados private? Si es así, ¿por qué funciona la solicitud directa de 2201.html (aunque la solicitud denegada parece manejar el mismo recurso, al menos según la entrada del registro de errores)?

Respuesta1

No hay nada integrado en Apache o mod_rewrite que haga que el nombre sea privateespecial, AFAIK. Sin embargo, es posible que su configuración incluya una regla predeterminada que trate ese nombre de manera diferente. Intente modificar su configuración para la palabra private, por ejemplo

grep private /etc/httpd/httpd.conf  # RedHat, CentOS
grep -r private /etc/apache2        # Debian, Ubuntu, etc.

Si encuentra una RewriteRule que coincida, ese es su culpable.

Las entradas de su registro dejan en claro que es el nombre privateen particular el que está causando el problema y que debe ser una RewriteRule la que hace que se rechace la solicitud.

Respuesta2

Este es un caso vergonzoso de RTM. La documentación de Apache sobreReescribir reglaestablece explícitamente que las cadenas de sustitución "se tratarán como una ruta URL a menos que exista un directorio llamado www en la raíz o en su sistema de archivos, en cuyo caso se tratará como una ruta del sistema de archivos", al menos al definir una RewriteRule fuera del contexto de un directorio.

Dado que mi sistema de archivos contiene /private, pero no /foo, y la URL /private/2212.htmlno se ve afectada por RewriteRule, se debería esperar el patrón anterior.

La solución fue agregar la bandera.[PT](paso a través) a mi RewriteRule.

información relacionada