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 文件,而不会影响任何子目录。我认为。它产生了我想要的行为,但感觉不是一个好的解决方案。
我在共享服务器上有一个网站,在 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
andindex.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 文件,而不会影响任何子目录。我认为。它产生了我想要的行为,但感觉不是一个好的解决方案。