好的,我有这样的网址:
http://example.com/admin/test.php?action=edit&id=2
但是我需要在规则中添加一个规则,将其重定向到另一个带有查询字符串的URL:
http://example.com/admin/login.php?redirect=test.php%3Faction%3Dedit%26id%3D2
我添加了这样的规则:
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?action = edit。缺少id = 2,因为它将其作为另一个$ _GET变量读取,而不是$ _GET ['redirect']的一部分。
是否可以转义%{QUERY_STRING}?我用谷歌搜索了我能想到的一切,无法在任何地方找到答案。
答案 0 :(得分: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]