htaccess查询字符串重定向

时间:2013-07-09 22:22:13

标签: php apache .htaccess mod-rewrite

好的,我有这样的网址:

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}?我用谷歌搜索了我能想到的一切,无法在任何地方找到答案。

1 个答案:

答案 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]