繁体   English   中英

Apache 响应 404 而不是 403,忽略 F 标志

[英]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]

FR=403之间应该没有区别。 AFAIK, F只是一个捷径。


我已经尝试过Options -MultiViews但我得到了相同的结果

但是,在禁用MultiViews 的情况下,404预期的响应。

禁用 MultiViews 后,如果您请求/pages/pageREQUEST_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.phpfoo.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! 但是FR=403应该导致相同的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM