2011-10-13 96 views
2

我試圖採取的mod_rewrite刪除GET變量

example.com/home?lang=fr &富=酒吧

,並重定向到

例子。 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

我找不到從查詢字符串中只刪除一個變量的方法。我確信有一個簡單的解決方案,但谷歌沒有幫助。 感謝

回答

5

在補充@whoisgregg答案(+1),這是從Apache維基一個很好的適應性。規則不完整(例如,通過查詢字符串訪問控制在這個頁面上不會抵抗一點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=一部分,但如果任何參數與郎結束你就會有問題。

所以,我們需要一些修復,我一直在這個星期的工作在這個問題上,這裏是一個更好的版本,我認爲:

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可以部分或完全地網址編碼並不會被檢測到,但這是一種罕見的情況。我alos刪除了lang值只有2個字符的控制。我認爲([^&]+)更好,它意味着所有人物,直到我匹配&

2

這是從apache wiki一種技術,它應該做的伎倆的變化:

RewriteCond %{QUERY_STRING} ^(.*)lang=([a-z]{2})&?(.*)$ 
RewriteRule (.*) /%2/$1?%1%3 [R=307] 
+0

@whoigregg:很好,但我已經添加了一些改進,請參閱我的答案。 – regilero