好的,所以我有一个这样的url:
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=编辑。它缺少id=2,因为它将其作为另一个$_GET变量读取,而不是$_GET['redirect']的一部分。
是否可以转义%{QUERY_STRING}?我在谷歌上搜索了我能想到的一切,但在任何地方都找不到答案。
好吧,如果你不介意在编码的URL末尾有一堆&
,你可以使用可选的捕获并手动编码&
。类似于:
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&
。只要你不介意最后有杂散电流。
如果您有很多可能的变量,并且不关心与号,只需在querystring条件的末尾添加更多的(?:&(.*)|)
,并将它们与backreferences匹配(例如,4):
RewriteCond %{QUERY_STRING} ^([^&]+)(?:&(.*)|)(?:&(.*)|)(?:&(.*)|)$
RewriteRule ^admin/(.*)?$ /login.php?redirect=/admin/$1'%3F%1'%26%2'%26%3'%26%4 [L,NE,R]