.htaccess RewriteRule有效,但地址栏中的URL没有变化?

时间:2012-03-30 19:04:09

标签: .htaccess mod-rewrite

我一直在拉我的头发试图解决这个问题,但没有任何工作。我在 mysite.com/test.php 有一个网页我想做一个简单的URL重写并将其更改为 mysite.com/testRewrite / 要实现此功能的代码应该是:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^testRewrite/$ test.php [NC,L]

无论出于何种原因,它都无法正常工作。当您转到新网址 - mysite.com/testRewrite / 时,它可以正常工作。

但是,如果您输入原始网址 mysite.com/test.php ,则不会将地址更改为浏览器中的新网址。

1 个答案:

答案 0 :(得分:10)

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,并且不会满足条件。