.htaccess 重写规则有效,但地址栏中的 URL 没有更改?



我一直在努力解决这个问题,但什么都不起作用。我在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,并且该条件将不满足。

最新更新