删除.PHP并保留查询字符串

时间:2011-12-08 12:49:08

标签: php .htaccess

我的代码:

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
RewriteRule ^(.*).php(.*) $1$2 [NC]

我正在尝试使用它

www.example.com/test.php?a=not&b=23

在网址中显示为:

www.example.com/test?a=not&b=23

并且没有www重定向到www。

我的错误是: 的 404 not found. The URL /test not found on this server

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您需要将标志QSA添加到RewriteRule指令:

RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,QSA,L]

QSA代表“查询字符串追加”。

答案 1 :(得分:0)

RewriteRule ^(.*).php(.*) $1$2 [NC]

你有点倒退。您的规则会使用网址x.php并将其重写为x。但x不存在。

相反,您需要分两个阶段执行此操作:

  1. x.php上,要求浏览器仅使用x重新请求[R=301]
  2. x重写为真实网址x.php(与您现在相同,但使用[QSA]而不是尝试自己匹配查询字符串。)
  3. 所以,也许使用类似的东西:

    # Force browser to use condensed URL form
    # (and matches will not fall through to the next rule)
    RewriteRule ^(.*)\.php$ http://www.example.com/$1 [R=301,QSA,L,NC]
    
    # Make condensed URL form work
    RewriteRule ^(.*)$ $1.php [QSA]
    

答案 2 :(得分:0)

你的rewriterules完全相反:当用户请求index.php时,它们将被重定向到索引。

尝试这样的事情:

RewriteEngine On
Options +FollowSymLinks

# for the non-www to www
RewriteRule %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^ http://www.example.com/

# for the non-php to php (if no other file extension supplied)
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !\.[A-Z]{3}$ [NC]
RewriteRule ^(.+)$ $1.php [R,L,QSA]