htaccess查询字符串重定向


htaccess query string redirect

好的,所以我有一个这样的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]