![使用 mod_rewrite 从 URL 中删除 PATH_INFO](https://linux22.com/image/709517/%E4%BD%BF%E7%94%A8%20mod_rewrite%20%E4%BB%8E%20URL%20%E4%B8%AD%E5%88%A0%E9%99%A4%20PATH_INFO.png)
更新:大部分问题都解决了。现在只有在您尝试访问的情况下才不起作用http://www.example.com/any-real-file-without-an-extension/anything-afterwards-that-doesnt-end-in-a-slash
。我猜服务器认为这any-real-file-without-an-extension
可能是一个目录……不确定如何修复它。
PHP 将“PATH_INFO”定义为 URL 的一部分:
包含任何客户端提供的路径名信息,位于实际脚本文件名之后但在查询字符串之前(如果可用)。例如,如果当前脚本是通过 URL 访问的
http://www.example.com/php/path_info.php/some/stuff?foo=bar
,$_SERVER['PATH_INFO']
则将包含/some/stuff
。
截至目前,我的网站将http://example.com/ contact_us.php/ANYTEXTCANGOHERE
视为http://example.com/contact_us.php
在这种情况下,/ANYTEXTCANGOHERE
是 PATH_INFO。我希望删除此路径信息直到文件名,否则将返回 404。有什么方法可以做到这一点吗?
这就是我的.htaccess
现在的样子。很简单。只需 301 重定向到 www 并在末尾添加一个 stripslashes,以及强制关联到没有扩展名的文件和没有扩展名的重写。我没有服务器根访问权限。
ErrorDocument 404 /404.php
ErrorDocument 503 /503.php
#Force www:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^foodthing.org [NC]
RewriteRule ^(.*)$ http://www.foodthing.org/$1 [L,R=301,NC]
#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foodthing\.org$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
#1)externally redirect "/file.php" to "/file"
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
#2)Internally map "/file" back to "/file.php"
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,L]
答案1
AcceptPathInfo
要禁用附加路径信息,您只需在服务器配置(或文件)中禁用即可.htaccess
。例如:
AcceptPathInfo Off
任何包含路径信息的 URL 现在都会触发 404。