2010-07-15 26 views
6

si fijo DirectorySlash Off en mi archivo .htaccess y llamo el directorio sin la barra al final consigo un 403-Forbidden de mi servidor. Si lo llamo con barra, todo funciona bien.Apache DirectorySlash Off - Sitio rompe

¿Alguien podría explicar por qué? Aquí están mis totalmente anónima .htaccess:

# GLOBAL CONFIG 
Options +FollowSymlinks 
DirectorySlash Off 
AddDefaultCharset utf-8 
php_value post_max_size 256M 
php_value upload_max_filesize 256M 

# BEGIN WordPress 
RewriteEngine On 
RewriteBase /folder/ 
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /folder/index.php [L] 
# END WordPress 

# REMOVE WWW 
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com$ [NC] 
RewriteRule ^(.*)$ http://domain.com$1 [R=301,L] 

Respuesta

11

Como sabe por la documentación, cuando se establece en DirectorySlashOff, peticiones a /folder no tienen DirectoryIndex evaluado. Esto significa que la solicitud no se asignará automáticamente al /folder/index.php.

mod_dir realiza esta comprobación en la fase de "reparación" del procesamiento de solicitud. mod_rewrite, que es responsable de sus definiciones RewriteRule, también realiza su procesamiento en esta fase cuando especifica las reglas en un archivo .htaccess.

Sin embargo, se programó con un conocimiento de módulos como mod_dir, e incluye una verificación para asegurarse de que el directorio actual se solicitó con una barra inclinada. De lo contrario, se niega a gestionar la solicitud, ya que hacerlo podría generar un comportamiento no definido.

La solicitud pasa luego a la fase de generación de contenido, que, dado que la solicitud no se asignó a un archivo real, se maneja por mod_autoindex. Dado que Indexes están deshabilitados en su host de manera predeterminada, mod_autoindex devuelve que es lo que ve.

Nota que desde DirectoryIndex no se evalúa, incluso si mod_rewriteeran para procesar la solicitud, todavía sería un error, ya que no ocurriría de auto-resolución a index.php, y la regla

RewriteRule . /folder/index.php [L] 

wouldn' t coincide, porque el . requiere una coincidencia en algo (pero la solicitud estaría en blanco).

Activación DirectorySlash evita este escenario mediante la corrección de las acciones impedido en todos los escenarios mencionados anteriormente, excepto la última nota, que está atendido por el hecho de que DirectoryIndex mapas de la solicitud de index.php de todos modos.

+0

¡Muchas gracias! Fácil de entender también, si leo su respuesta. – gearsdigital

+0

Pero, ¿qué ocurre si queremos ofuscar nuestra estructura de directorios y aún utilizar 'mod_rewrite' para cada solicitud? Digamos que tengo un sitio con un directorio '/ private'. Apache me redirigiría a '/ private /' si solicito '/ private' si' DirectorySlash' está 'Activado', permitiendo así que se divulgue la información. ¿Qué sucede si solo deseo enviar'/private' a mi 'índice. Controlador frontal php'? – tonix

2

Creo que es porque cuando se enciende DirectorySlash fuera, se desactiva la corrección automática de la URL y se está tratando de mostrar la lista de directorios, pero afortunadamente, es probable que haya desactivado esta en alguna parte (o en permisos de archivos) por lo que envía un 403-Prohibido. Supongo que cuando lo enciendes, funciona normalmente. Por lo que entiendo de los documentos, no es muy bueno utilizar DirectorySlash off para mayor seguridad. http://httpd.apache.org/docs/2.1/mod/mod_dir.html

+0

Laurent, gracias por su respuesta. He leído la ** advertencia de seguridad ** en los documentos de apache también, pero necesito entender qué salió mal aquí. Por cierto, la lista de directorios está deshabilitada por defecto en mi servidor webhost. – gearsdigital

+0

Usted 'rewriteBase es/folder /' por lo que necesita que la barra final en la url coincida. Puede configurarlo en '/ folder' y creo que debería funcionar sin la barra inclinada final. – laurent

+0

También recibo un 403 si sigo su sugerencia. – gearsdigital

8

Con Apache 2.4 puede permitir las reescrituras en archivos .htaccess configurando RewriteOptions AllowNoSlash.

Changes with Apache 2.3.16 
... 
*) mod_rewrite: Add the AllowNoSlash RewriteOption, which makes it possible 
    for RewriteRules to be placed in .htaccess files that match the directory 
    with no trailing slash. PR 48304. 
    [Matthew Byng-Maddick <matthew byng-maddick bbc.co.uk>] 
... 

Ver Apache documentation of mod_rewrite