Apache DirectorySlash Off - 站点中断

时间:2010-07-15 18:51:35

标签: apache .htaccess http-status-code-403

如果我在我的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]

4 个答案:

答案 0 :(得分:12)

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

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

但是,它的编程意识是mod_dir之类的模块,并包含一个检查以确保使用尾部斜杠请求当前目录。如果没有,它拒绝处理请求,因为这样做可能会导致未定义的行为。

然后,请求转到内容生成阶段,由于请求未映射到真实文件,因此由mod_autoindex处理。鉴于默认情况下您的主机已停用Indexesmod_autoindex会返回您所看到的403 Forbidden

请注意,由于未评估DirectoryIndex,即使mod_rewrite 来处理请求,它仍然会失败,因为没有{{1}的自动解析会发生,你的规则

index.php

不匹配,因为RewriteRule . /folder/index.php [L] 需要匹配某些内容(但请求将为空白)。

启用.可以通过纠正除上一个注释之外的所有前面提到的方案中的阻止操作来防止这种情况,最后一个注释由DirectorySlash将请求映射到{{1无论如何。

答案 1 :(得分:8)

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

 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>]
 ...

请参阅Apache documentation of mod_rewrite

答案 2 :(得分:2)

我认为因为当你关闭DirectorySlash时,它会禁用url的自动更正,并且它正在尝试显示目录​​列表,但幸运的是你可能已经禁用了某个地方(或文件权限),因此它发送了403-Forbidden。我想当你打开它时,它可以正常工作。 根据我从文档中理解的内容,将DirectorySlash用于安全性并不是很好。 http://httpd.apache.org/docs/2.1/mod/mod_dir.html

答案 3 :(得分:0)

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

示例: “ GET / somedir”将指向rewrite log中的<Directory /var/www/html/public>,但是访问日志中的(!)请求的文件名(%f)仍将/var/www/html/public/somedir/-这是疯狂的apache逻辑。 apache会显示503(不带选项+索引)或目录列表(否则),并带有错误的url,例如/ subdir /而不是/ somedir / subdir /

因此,我发现只有一个可行的解决方案-使用别名:

AliasMatch "/somedir$" "/var/www/html/public/somedir/index.html"

希望这会在2020+年帮助别人:D