5

我试图从我的网站中删除 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 扩展被删除,参数被保留,但页面不会被提供,因为浏览器说有太多的重定向。

请问有人有什么想法吗?

4

2 回答 2

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]

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

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

于 2012-09-02T18:21:04.873 回答
0

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

有用的阅读herehere

于 2012-09-01T22:29:41.337 回答