2013-07-09 182 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

相关问题