我的代码:
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
有什么想法吗?
答案 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
不存在。
相反,您需要分两个阶段执行此操作:
x.php
上,要求浏览器仅使用x
重新请求[R=301]
。x
重写为真实网址x.php
(与您现在相同,但使用[QSA]
而不是尝试自己匹配查询字符串。)所以,也许使用类似的东西:
# 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]