如果我在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]
根据文档,您知道,当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
来解决。
使用Apache 2.4,您可以通过设置RewriteOptions AllowNoSlash
允许重写.htaccess文件。
我想是因为当您关闭DirectorySlash时,它将禁用url的自动更正,并尝试显示目录列表,但是幸运的是,您可能已在某处(或在文件权限中)禁用了此功能,因此它发送了403-Forbidden。我想当您打开它时,它可以正常工作。据我从文档中了解到,使用DirectorySlash off来提高安全性不是很好。http://httpd.apache.org/docs/2.1/mod/mod_dir.html
正如汤姆已经回答的那样,RewriteOptions有一个特殊的选项,但仅适用于Apache 2.3.16+,因此,如果您像我一样具有较旧版本的apache,则您无法重写同一目录的url,因为apache不会不知道该目录。