0

好的,所以我有一个这样的网址:

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} ?我用谷歌搜索了所有我能想到的东西,但在任何地方都找不到答案。

4

1 回答 1

0

好吧,如果您不介意&在编码 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&. 只要你不介意最后有那个杂散的&符号。

如果您有很多可能的变量,并且不关心与号,只需(?:&(.*)|)在查询字符串条件的末尾添加更多并将它们与反向引用匹配(例如,4):

RewriteCond %{QUERY_STRING} ^([^&]+)(?:&(.*)|)(?:&(.*)|)(?:&(.*)|)$
RewriteRule ^admin/(.*)?$ /login.php?redirect=/admin/$1\%3F%1\%26%2\%26%3\%26%4 [L,NE,R]
于 2013-07-10T00:06:48.240 回答