使用mod_rewrite从URL中删除PATH_INFO

更新:大部分解决。 现在只有在您尝试访问http://www.example.com/any-real-file-without-an-extension/anything-afterwards-that-doesnt-end-in-a-slash的情况下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的一部分:

包含任何客户端提供的path名信息,尾随实际的脚本文件名,但在查询string之前(如果可用)。 例如,如果当前脚本通过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。 我想这样做,这个path信息被删除到文件名,否则返回一个404。 有什么办法可以做到吗?

这里是我的.htaccess现在看起来像。 这很简单。 只是一个301redirect到www和最后的反斜杠,以及强制关联到文件没有扩展名和重写没有扩展。 我没有服务器root权限。

 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] 

要禁用其他path信息,只需在服务器configuration(或.htaccess文件)中禁用AcceptPathInfo 。 例如:

 AcceptPathInfo Off 

任何包含path信息的URL现在都会触发404。