Apache DirectorySlash Off-网站中断

问题描述 投票:8回答:4

如果我在DirectorySlash Off文件中设置了.htaccess并调用目录不带,则我从服务器获取一个403-Forbidden。如果我用斜线将其命名,则一切正常。

有人可以解释为什么吗?这是我完全匿名的.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]
apache .htaccess http-status-code-403
4个回答
15
投票

根据文档,您知道,当DirectorySlash设置为Off时,对/folder的请求未评估DirectoryIndex。这意味着请求将不会自动映射到/folder/index.php

mod_dir在请求处理的“修复”阶段执行此检查。当您在mod_rewrite文件中指定规则时,负责RewriteRule定义的.htaccess也将在此阶段执行其处理。

但是,在编程时要注意mod_dir之类的模块,并包括进行检查以确保请求当前目录时带有斜杠。如果没有,它将拒绝处理该请求,因为这样做可能导致不确定的行为。

然后,请求进入内容生成阶段,由于未将请求映射到真实文件,因此由mod_autoindex处理。假设默认情况下主机上禁用Indexes,则mod_autoindex返回403 Forbidden,即您看到的内容。

请注意,由于未评估DirectoryIndex,即使mod_rewrite 处理请求,该请求仍将失败,因为不会发生对index.php的自动解析,因此您的规则

RewriteRule . /folder/index.php [L]

将不匹配,因为.要求在某项上匹配(但请求为空白)。>>

启用DirectorySlash可以通过纠正前面提到的所有情况中除最后一个音符之外的被阻止的操作来防止此情况,这通过DirectoryIndex无论如何将请求映射到index.php来解决。


9
投票

使用Apache 2.4,您可以通过设置RewriteOptions AllowNoSlash允许重写.htaccess文件。


2
投票

我想是因为当您关闭DirectorySlash时,它将禁用url的自动更正,并尝试显示目录​​列表,但是幸运的是,您可能已在某处(或在文件权限中)禁用了此功能,因此它发送了403-Forbidden。我想当您打开它时,它可以正常工作。据我从文档中了解到,使用DirectorySlash off来提高安全性不是很好。http://httpd.apache.org/docs/2.1/mod/mod_dir.html


0
投票

正如汤姆已经回答的那样,RewriteOptions有一个特殊的选项,但仅适用于Apache 2.3.16+,因此,如果您像我一样具有较旧版本的apache,则您无法重写同一目录的url,因为apache不会不知道该目录。

© www.soinside.com 2019 - 2024. All rights reserved.