2013-07-09 225 views
0

好了,所以我有這樣一個網址:htaccess的查詢字符串重定向

http://example.com/admin/login.php?redirect=test.php%3Faction%3Dedit%26id%3D2 

http://example.com/admin/test.php?action=edit&id=2 

不過,我需要在規則添加到該用的查詢字符串這樣重定向到另一個網址

我加了這樣一條規則:

RewriteRule ^admin/(.*)?$ /login.php?redirect=/admin/$1?%{QUERY_STRING} [R,L] 

和它的作品大部分,但有一個問題,查詢字符串是不是被逃脫,所以它認爲這些是其他$ _GET變量。它看起來像這樣:

http://example.com/admin/login.php?redirect=test.php%3Faction=edit&id=2 

所以重定向讀爲test.php的行動=編輯?它缺少id = 2,因爲它將它讀爲另一個$ _GET變量,而不是$ _GET ['redirect']的一部分。

是否可以轉義%{QUERY_STRING}?我搜索了所有我能想到的東西,並且無法在任何地方找到答案。

+0

你在哪裏重定向,因爲你可能想添加諸如'location(「header:login.php?」。encodeuri(current url));'到你的重定向頁面。然後,如果重定向參數發送和登錄是好的使用頭decodeuri(重定向) – Class

+0

我沒有選擇這樣做。我在wordpress中工作,它會自動發送一封電子郵件。所以它發送的URL,但我需要重定向它登錄與重定向作爲參數。 – ngreenwood6

回答

0

好吧,如果您不介意在編碼網址的末尾有一堆&,您可以使用可選捕獲並手動編碼&。喜歡的東西:

RewriteCond %{QUERY_STRING} ^([^&]+)(?:&(.*)|)$ 
RewriteRule ^admin/(.*)?$ /login.php?redirect=/admin/$1\%3F%1\%26%2 [L,NE,R] 

所以,如果你去:

http://example.com/admin/test.php?a=1&b=2

您重定向到:

http://example.com/login.php?redirect=/admin/test.php%3Fa=1%26b=2

然而,去:

http://example.com/admin/test.php?a=1

將您重定向到:

http://example.com/login.php?redirect=/admin/test.php%3Fa=1%26

和你的PHP腳本將提取$_GET['redirect']參數爲:/admin/test.php?a=1&。只要你不介意在最後有這個流浪的直線。

如果你有很多可能的變量,並且不關心的符號,只是反向引用添加更多(?:&(.*)|)到的查詢字符串結束條件和匹配(例如,4):

RewriteCond %{QUERY_STRING} ^([^&]+)(?:&(.*)|)(?:&(.*)|)(?:&(.*)|)$ 
RewriteRule ^admin/(.*)?$ /login.php?redirect=/admin/$1\%3F%1\%26%2\%26%3\%26%4 [L,NE,R] 
+0

感謝您的回覆,但我不確定有多少人可以在那裏。甚至可能沒有。我希望有一個更清潔的解決方案。 – ngreenwood6

相關問題