[英]Apache responds with 404 instead of 403, ignoring F flag
我有这个简单的项目层次结构:
位于/www
根文件夹的.htaccess
文件的内容是:
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} "\.php$"
RewriteRule .* - [F]
当请求任何.php文件但index.php
时, .htaccess
中的规则应返回403 。 .php模板的内容不相关。
如果我没记错的话,如果请求的最后一部分是现有.php文件的名称并且重写引擎已打开,则 Apache 无论您是否指定.ZE1BFD762321E409CEE4AC0B6E841部分都会为它服务。 就我而言,如果我注释掉.htaccess
的最后两行,则这些网址中的任何一个:
localhost/pages/page
localhost/pages/page/
返回/pages/page.php
的内容
我的问题是,鉴于上述.htaccess
,如果我写这个 url :
localhost/pages/page.php
我得到了预期的403 。 但如果我写任何一个:
localhost/pages/page
localhost/pages/page/
我得到404 (not found) 而不是预期的403 。 为什么我得到404 ?
有趣...我可以在 Apache 2.4 上重现此行为,但无法解释它 - 在我看来它看起来像一个错误,因为用R=403
替换F
会产生所需的结果(应该没有区别) - 见下文。
澄清一下,对于/pages/page
解析为/pages/page.php
首先取决于启用MultiViews
(如评论中所述)。 或者,您可以使用 mod_rewrite 执行此操作 - 但这里没有证据。 MultiViews 在 Apache 上默认禁用,但一些共享主机出于某种原因确实启用了它(它使无扩展 URL “正常工作”)。 但是,MultiViews 是与 mod_rewrite 发生意外冲突的常见原因。 而且,无扩展名 URL“只是(意外地)起作用”这一事实可能会导致规范化的其他问题。
我认为存在“错误”的原因是,如果您只是将F
标志更改为R=403
,那么您确实会得到“预期的”403 响应:
RewriteCond %{REQUEST_FILENAME} "\.php$" RewriteRule.* - [R=403]
F
和R=403
之间应该没有区别。 AFAIK, F
只是一个捷径。
我已经尝试过
Options -MultiViews
但我得到了相同的结果
但是,在禁用MultiViews 的情况下,404是预期的响应。
禁用 MultiViews 后,如果您请求/pages/page
, REQUEST_FILENAME
将采用/abs/path/to/pages/page
形式(无.php
扩展名)。 您的条件不匹配,因此请求进入 404。
你最好禁用 MultiViews。 /pages/page
和/pages/page/
“神奇地”解析为/pages/page.php
是不“正常的”。 在这种情况下, /pages/page
和/pages/page/
导致 404 是“正常的”。 如果您使用 mod_rewrite 做很多事情,其中请求的 URL 映射到文件系统,那么您可能会遇到冲突。
请注意,MultiViews 不仅适用于.php
文件。 启用 MultiViews 后,您就拥有了无扩展的一切。 图像、脚本、HTML、样式表等。如果您有多个具有共同基本名称和 mime 类型的文件,将提供哪个文件? 例如。 foo.php
或foo.html
?
当然,您可以创建 mod_rewrite 指令来启用此行为 - 但这不是自动的。
更新:一个更简洁的例子......
给定一个文件/page.php
(在文档根目录中)并且 MultiViews 已启用。
(例如Options +MultiViews
)
请求/page
(或/page/
)导致 MultiViews/ /page.php
通过内部子请求服务 /page.php。
现在,让我们使用 mod_rewrite 阻止所有访问并提供 403 Forbidden:
RewriteRule ^ - [F]
这应该使用 403 阻止每个请求。但是,请求/page
或/page/
- 由 MultiViews成功重写的 URL - 会导致 404 Not Found 响应!
但是,将上述规则更改为使用R
标志:
RewriteRule ^ - [R=403]
现在,一切都返回 403,包括上面提到的两个 URL! 但是F
和R=403
应该导致相同的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.