防止 .htaccess 中的 RewriteRule 循环

防止 .htaccess 中的 RewriteRule 循环

我正在尝试引入一些不错的网址:

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 中执行此操作,因为我无权访问服务器配置文件。

编辑:

日志档案: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]

答案1

您是否尝试过在 RewriteRule 中添加“L”(最后)?即,

重写规则^.* /%1.html? [R=301,L]

这会将该规则标记为最后一条规则,本质上相当于 C 中的 break 语句。一旦执行了该规则,它将停止匹配规则。

这可能是原因吗?

安德鲁

答案2

重写中设置的 Apache ENV 变量不会在重定向后保留 - 因此,一旦执行 R=301,一切就回到原点 - 请求在全新 Apache 上下文中工作。这就是你的无限循环。

如果您想通过重写来执行此操作(这很有意义 - 这样浏览器就会看到正确的 URL),您可能必须设置 cookie 而不是尝试使用 ENV,或者在后台使用实际服务器路径做一些有趣的事情,将某些路径排除在重定向之外。

此外 - 正如其他人所说,[L] 没有用 - 它会导致其余的重写规则被完全忽略。

相关内容