gpt4 book ai didi

apache - mod_rewrite 删除一个 GET 变量

转载 作者:行者123 更新时间:2023-12-02 07:44:55 27 4
gpt4 key购买 nike

我正在努力

example.com/home?lang=fr&foo=bar

并重定向到

example.com/fr/home?foo=bar

我试过了

    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 个字符的控制。我认为 ([^&]+) 更好,它表示所有字符,直到我匹配 &

关于apache - mod_rewrite 删除一个 GET 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7756688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com