我一直在努力解决这个问题,但什么都不起作用。我在mysite.com/test.php上有一个网页我想做一个简单的URL重写,并将其更改为mysite.com/testRewrite/实现这一点的代码应该是:
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^testRewrite/$ test.php [NC,L]
不管出于什么原因,它都不起作用。当您转到新的URL-mysite.com/testRewrite/时,它就工作了。
但是,如果您键入原始URLmysite.com/test.php,则不会在浏览器中将地址更改为新URL。
mod_rewrite不会自动强制重定向重写URL的浏览器。您的规则只是简单地说"如果有人要求/testRewrite/
,请在内部将其更改为/test.php
"。它不会处理对/test.php
的实际请求,这就是为什么当您尝试访问mysite.com/test.php时,它会给您/test.php
。
现在,mod_rewrite的问题是,如果你简单地添加这个规则:
RewriteRule ^test.php$ /testRewrite/ [L,R=301]
当它请求/test.php
到/testRewrite/
时,它会重定向浏览器,第一条规则将在浏览器重定向后应用,URI被重写到/test.php
,然后它通过整个重写引擎返回,上面的规则被再次应用,从而重定向浏览器,因此第一条规则重写到/test.php
,上面规则再次重定向,等等。你会得到一个重定向循环。您必须添加一个条件,以确保浏览器*实际请求了/test.php
,并且它不是通过重写引擎生成的URI:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /test.php [NC]
RewriteRule ^test.php$ /testRewrite/ [L,R=301]
这样,在301重定向发生后,该规则将不会再次应用,因为实际请求将是GET /testRewrite/ HTTP/1.1
,并且该条件将不满足。