防止在.htaccess中的RewriteRule循环

我正在尝试引入漂亮的url:

RewriteRule ^(.*).html$ index.php?arianne_url=content/$1 [L] 

而我想在外部重写访问旧式的url:

 RewriteCond %{QUERY_STRING} arianne_url=content/([^&]*) RewriteRule ^.* /%1.html? [R=301] 

问题是这个循环无止境。

我试图定义env并检查它,但是这仍然导致无限循环

 RewriteRule ^(.*).html$ index.php?arianne_url=content/$1 [L,env=arianne:rewrite] RewriteCond %{env:arianne} ^$ RewriteCond %{QUERY_STRING} arianne_url=content/([^&]*) RewriteRule .* /%1.html? [R=301] 

我必须在.htaccess中执行此操作,因为我无权访问服务器configuration文件。

编辑:

日志文件: http : //pastebin.ca/1927769

 # enable nice urls RewriteRule ^(.*).html$ index.php?arianne_url=content/$1 [L,env=arianne:rewrite] # Redirect old style request to new nice url RewriteCond %{env:arianne} ^$ RewriteCond %{QUERY_STRING} arianne_url=content/([^&]*) RewriteRule ^.* /%1.html? [R=301,L] 

你有没有尝试在你的RewriteRule中添加'L'(last)? 即

RewriteRule ^。* /%1.html? [R = 301,L]

这将把规则标记为最后的规则,并且基本上等同于C中的break语句。一旦执行了这个规则,它将停止匹配规则。

这可能是原因吗?

安德鲁

重写时设置的Apache ENVvariables不会保留在redirect中 – 所以一旦你做了R = 301,它就回到了原来的一个 – 请求在全新的apache上下文中工作。 那是你的无限循环。

如果你想通过重写(这是有道理的 – 所以浏览器看到正确的URL),你可能不得不设置一个cookie,而不是试图使用ENV,或者在幕后实际的服务器path做一些时髦的东西,不包括某些redirect的。

另外 – 正如其他人所说的[L]是没有用的 – 这将导致其他的重写文件被完全忽略。