Apache 如何处理 index.php/some_text 网页请求?它 returns http 状态 200 而不是预期的 404

How does Apache handle index.php/some_text webpage requests? It returns http status 200 instead of expected 404

我在共享服务器上有一个网站,在 public_html 目录中有一些非常基本的 php 页面,以及一些子目录和其他页面:

index.php
test.php
subdir1/index.php
subdir2/index.php

查看我的访问者日志,我访问了 index.php/some_text 和 index.php/some_other_text 等等。天真地我希望那些收到 http 状态 404,因为 a) 没有名为 index.php 的目录和 b) 不存在名为 some_text 和 some_other_text 的文件。但是,Apache return 正在使用 http 状态 200 处理文件 index.php。

我可以在 .htaccess 中设置什么,在这些情况下 return 404 状态,而不限制有效的子目录吗?

我找到了一些设置“DirectorySlash Off”的建议,但没有任何区别。我也试过

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ - [R=404,L]

但这也没什么区别。 谢谢

I'm getting visits to index.php/some_text and index.php/some_other_text and so on.

URL中以斜杠开头并跟在物理文件之后的部分称为附加路径名信息(或 路径信息 )。因此,/some_text(在您的示例中)是路径信息。

在这种情况下,index.php 收到请求,并且 /some-text 通过 PATH_INFO 环境变量传递给脚本(在 PHP 中,这在 $_SERVER['PATH_INFO']超全球)。

默认情况下,路径信息在 URL 上是否有效取决于负责请求的处理程序。 PHP 个文件默认允许路径信息,但 .html 个文件不允许。因此,默认情况下 /index.html/some-text 导致 404.

您可以通过在 Apache 配置文件中设置 AcceptPathInfo Off / .htaccess 来禁用路径信息。通过这样做,对 /index.php/some-text 的请求现在将导致 404.

相反,如果您设置 AcceptPathInfo On,那么 /index.html/some-text 也将被允许。

或者,您可以在 .htaccess 中使用 mod_rewrite 为此类 URL 明确触发 404。例如,仅定位 .php 个文件(任何位置):

RewriteEngine On

RewriteRule \.php/ - [R=404]

或者,文档根目录中只有 .php 个文件:

RewriteRule ^[^/]+\.php/ - [R=404]

或者,您可以显式检查 PATH_INFO 服务器变量以阻止任何包含路径信息的 URL。例如:

RewriteCond %{PATH_INFO} .
RewriteRule . - [R=404]

请注意,某些框架使用路径信息以前端控制器模式路由请求(而不是使用查询字符串或直接解析请求的 URI)。

参考:


I found some suggestions to set "DirectorySlash Off"

与本问题无关。设置 DirectorySlash Off 可防止 mod_dir 将尾部斜杠附加到目录请求中。

我试过

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/[^/]+\.php/.*$ 
RewriteRule ^(.*)$ - [R=404,L]

这只会影响根目录中的 *.php 文件,而不会影响任何子目录。我认为。它产生了我想要的行为,但感觉不是一个好的解决方案。