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
我该怎么办?或者是我只能使用它们而不能同时使用它们?
感谢。
答案 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'], ' ', '+');
就足够了。