我正在尝试采取
example.com/home?lang=fr&foo=bar
并重定向到
example.com/fr/home?foo=bar
I tried
RewriteCond %{QUERY_STRING} lang=([a-z]{2})&?
RewriteRule ^(.*) /%1/$1 [R=307]
但我得到了一个重定向循环。
这是因为在“fr”移动到请求字符串的前面后,lang=fr 并未从查询字符串中删除。这导致:
example.com/fr/fr/fr/fr/fr/fr/fr/fr/fr/....
我可以用
RewriteRule ^(.*) /%1/$1? [R=307]
但这也从查询字符串中删除了我想保持完整的 foo=bar
我找不到一种从查询字符串中仅删除一个变量的方法。我确信有一个简单的解决方案,但谷歌没有帮助。
谢谢
作为对 @whoisgregg 答案 (+1) 的补充,这是对 apache wiki 的一个很好的改编。那里的规则并不完全好(例如,此页面上通过查询字符串进行的访问控制不会抵抗一点 urlencoding)。
我们有一个适用于测试用例的可行解决方案,但某些扩展测试可能会失败:
RewriteCond %{QUERY_STRING} ^(.*)lang=([a-z]{2})&?(.*)$
RewriteRule (.*) /%2/$1?%1%3 [R=307]
foo.php?foo=bar&novlang=fr&toto=titi => /fr/foo.php?foo=bar&novtoto=titi
这里的lang=
检测到部分,但如果任何参数以lang你会有问题的。
所以,我们需要一些修复,我这周一直在研究这个主题,我认为这是一个更好的版本:
RewriteCond %{QUERY_STRING} (.*)(^|&|%26|%20)lang(=|%3D)([^&]+)(.*)$
RewriteRule (.*) /%4/$1?%1%5 [R=307]
foo.php?foo=bar&novlang=fr&toto=titi => not matched (normal, no lang=)
foo.php?foo=bar&lang=fr&toto=titi&b=a => fr/foo.php?foo=bar&toto=titi&a=b
这里唯一悬而未决的问题是lang
可能是部分或完全 url 编码并且不会被检测到,但这种情况很少见。我还删除了 lang 值仅包含 2 个字符的控制。我认为([^&]+)
更好,这意味着所有字符,直到我匹配&
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)