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

时间:2012-09-01 21:42:28

标签: php apache mod-rewrite parameters

我试图从我的网站上删除PHP扩展程序。当用户请求PHP文件时,PHP将被删除,用户将被重定向,当用户键入不带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]

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

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扩展并保留了参数,但是由于浏览器显示重定向太多,页面不会被提供。

有任何想法吗?

2 个答案:

答案 0 :(得分:2)

感谢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]

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

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

答案 1 :(得分:0)

您可能希望使用记录为here%{QUERY_STRING}参数。

有用的阅读herehere