我正在尝试引入一些不错的网址:
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] 没有用 - 它会导致其余的重写规则被完全忽略。