使用 mod_rewrite 从 URL 中删除 PATH_INFO

使用 mod_rewrite 从 URL 中删除 PATH_INFO

更新:大部分问题都解决了。现在只有在您尝试访问的情况下才不起作用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。

相关内容