PHP Mod_rewrite和URL编码的符号 - 只能使用它们中的任何一个而不能同时使用它们?

时间:2011-01-24 00:13:06

标签: php regex mod-rewrite request urlencode

mod_rewrite似乎在我进入$ _REQUEST之前转换了plus的符号,我不知道该修复它...

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$   invite.php?key=$1 [L,QSA]

例如,我将此输入到我的网址

http://mywebsite/invite/xPo8lUEXpqg8bKL%2B32o6yIOK

我明白了,

xPo8lUEXpqg8bKL 32o6yIOK

但如果我输入此请求而不通过mod_rewrite,

http://mywebsite/invite.php?key=xPo8lUEXpqg8bKL%2B32o6yIOK

我得到了我想要的东西,

xPo8lUEXpqg8bKL+32o6yIOK

我该怎么办?或者是我只能使用它们而不能同时使用它们?

感谢。

2 个答案:

答案 0 :(得分:3)

尝试添加[B]标志(转义反向引用):

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$   invite.php?key=$1 [L,B,QSA]

答案 1 :(得分:1)

“+”字符在URL的查询字符串部分中保留为空格。实际上,rfc3986中记录了作为保留字符的“+”状态,rfc1630中记录了其作为空格替换字符的(现在遗留)用途。

由于Apache试图避免任何冲突,它会在传递之前自动将“+”作为字符串转义。


在重写时使用[NE] (NoEscape)标志可以防止发生这种行为。

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$   invite.php?key=$1 [L,NE,QSA]

但是,通过使用此功能,如果用户手动键入URL,则非空格“+”将替换为空格。为了安全起见,只需用“+”符号替换输入中的所有空格。


非常坦率地说,因为您不接受输入中的空格,只需用“+”符号替换所有空格即可。使用[NE]标志可以带来更大的问题,然后进行简单的字符替换。一个简单的$_GET['key'] = str_replace($_GET['key'], ' ', '+');就足够了。