El directorio private
se encuentra bajo mi DocumentRoot y, a pesar de su nombre, debería ser accesible como cualquier otro directorio. Pero si agrego lo siguiente RewriteRule
a 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 private
a 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 private
especial, 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 private
en 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.html
no 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.