11

如果我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

4 回答 4

16

如您所知,根据文档,当DirectorySlash设置为时Off,请求/folderDirectoryIndex评估。这意味着请求不会自动映射到/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的事实来处理的。DirectoryIndexindex.php

于 2010-07-17T21:59:54.693 回答
10

在 Apache 2.4 中,您可以通过设置 .htaccess 文件来允许重写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>]
 ...

请参阅mod_rewrite 的 Apache 文档

于 2012-02-23T08:47:22.750 回答
2

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

于 2010-07-15T19:15:44.043 回答
0

正如汤姆已经回答的那样,RewriteOptions 有特殊选项,但仅适用于 Apache 2.3.16+,所以如果你像我一样拥有旧版本的 apache,那么你不能为同一目录重写 url,因为 apache 没有知道这个目录。

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

所以,我只找到了一个可行的解决方案——使用别名:

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

希望这对 2020 年+的其他人有所帮助:D

于 2020-06-11T09:43:09.397 回答