Apache 中无法访问“私有”目录

Apache 中无法访问“私有”目录

该目录private位于我的 DocumentRoot 下,尽管它的名称不同,但它应该像任何其他目录一样可以访问。但如果我将以下内容添加RewriteRule到 httpd.conf:

RewriteRule ^/([^\.]+)$ /$1.html [L]

Apache 返回 403http://服务器/private/2201. 错误日志显示

client denied by server configuration: /private/2201.html

如果我随后将其重命名privatefoo,或者直接请求 2201.html,则会提供该文件:

127.0.0.1 - - [21/Nov/2011:10:24:45 +0100] "GET /private/2201 HTTP/1.1" 403 214
127.0.0.1 - - [21/Nov/2011:10:24:58 +0100] "GET /foo/2201 HTTP/1.1" 200 3068
127.0.0.1 - - [21/Nov/2011:10:27:39 +0100] "GET /private/2201.html HTTP/1.1" 200 3068

这让人困惑。名为 的目录是否有任何特殊规则private?如果有的话——为什么直接请求 2201.html 会起作用(尽管被拒绝的请求似乎处理相同的资源,至少根据错误日志条目)?

答案1

据我所知,Apache 或 mod_rewrite 中没有任何东西使该名称变得private特殊。但是,您的配置可能带有默认规则,该规则会以不同的方式处理该名称。尝试在您的配置中查找单词private,例如

grep private /etc/httpd/httpd.conf  # RedHat, CentOS
grep -r private /etc/apache2        # Debian, Ubuntu, etc.

如果您发现匹配的 RewriteRule,那就是罪魁祸首。

您的日志条目清楚地表明,特定名称是private导致问题的原因,并且一定是 RewriteRule 导致请求被拒绝。

答案2

这是 RTM 的一个尴尬案例。Apache 关于重写规则明确指出替换字符串“将被视为 URL 路径,除非根目录或文件系统中存在名为 www 的目录,在这种情况下它将被视为文件系统路径”,至少在目录上下文之外定义 RewriteRule 时是这样。

由于我的文件系统包含/private,但不包含/foo,并且 URL/private/2212.html不受 RewriteRule 的影响,因此应该会出现上述模式。

解决方案是添加标志[葡萄牙](传递)到我的 RewriteRule。

相关内容