如何使用Apache Mod_rewrite删除php扩展名,同时保留GET参数?

我试图从我的网站删除PHP扩展。 当用户请求一个PHP文件时,PHP将被删除,用户将被redirect,当用户input一个没有PHP的URL时,实际的PHP文件将被提供。 除非在URL中有GET参数,否则这很有效。 我的规则如下:

# remove .php ONLY if requested directly RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] # remove trailing slash ONLY if it is not an existing folder RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # rewrite to FILENAME.php if such file does exist and is not a folder RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ /$1.php [L,QSA] 

我想这应该已经能够删除PHP,即使有任何GET参数,但它失败了。 我也尝试过这样的事情:

 RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA] 

它也没有工作,PHP仍然在那里。 但是,如果我尝试:

 RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA] 

即删除RewriteCond,PHP的扩展名被删除,参数被保留,但该页面将不会作为浏览器说,有太多的redirect。

任何人有任何想法吗?

谢谢SteAp的回答。 我碰巧能够找出一个方法来处理它,并希望在这里分享,以防其他人遇到类似的问题。

在我的规则中,我有

 # remove .php ONLY if requested directly RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

在用户请求PHP文件时执行外部重定向。 这里的RewriteCond是为了防止重定向循环 – 即由于不正确的内部重写和外部重定向导致无尽的重定向(删除PHP,然后添加PHP,然后再次删除,…)

有参数的时候,实际的头文件是http://domain.com/file.php ?…. HTTP / 1.1就像这样,所以RewriteCond中的模式将不起作用,因为它没有带参数考虑到。

要解决这个问题,只需用上面的代码替换:

 # remove .php ONLY if requested directly RewriteCond %{THE_REQUEST} (\.php(.*)\sHTTP/1) RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

通过这样做,参数可以被模式匹配,现在一切正常。

希望这会帮助有类似问题的人(或者它只是像我这样的noob?大声笑)

您可能希望使用此处记录的%{QUERY_STRING}参数。

这里和这里有用的阅读。