PHP Mod_rewrite 和 URL 编码符号 - 只能使用其中一个,但不能同时使用?

Posted

技术标签:

【中文标题】PHP Mod_rewrite 和 URL 编码符号 - 只能使用其中一个,但不能同时使用?【英文标题】:PHP Mod_rewrite and URL-encoded symbols - only can use either of them but not both? 【发布时间】:2011-06-14 05:32:26 【问题描述】:

mod_rewrite好像在我拿到$_REQUEST之前把加号的符号转换了,不知道怎么解决...

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

例如,我将这个输入到我的 URL 中,

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

我明白了,

xPo8lUEXpqg8bKL 32o6yIOK

但是如果我输入这个请求而不通过 mod_rewrite,

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

我得到了我想要的,

xPo8lUEXpqg8bKL+32o6yIOK

我能做什么?还是我只能用其中一个不能同时用??

谢谢。

【问题讨论】:

你能澄清一下你输入了什么,你得到了什么? @Pekka:对不起,我刚刚纠正了我在上面写作中的错误,并澄清了我的意见。谢谢。 +1 个有趣的问题 - 以前从未遇到过。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

“+”字符作为空格保留在 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'], ' ', '+'); 就足够了。

【讨论】:

感谢您。我刚刚尝试过,但仍然没有运气...请问还有其他选择吗...? @lauthiamkok:由于您不接受输入中的空格,因此一个简单的$_GET['key'] = str_replace($_GET['key'], ' ', '+'); 就足够了。无论如何,这将是您唯一的空间来源。

以上是关于PHP Mod_rewrite 和 URL 编码符号 - 只能使用其中一个,但不能同时使用?的主要内容,如果未能解决你的问题,请参考以下文章

用户友好的 URL - mod_rewrite 和 php 重定向

使用 mod_rewrite 从 URL 的末尾隐藏 .php

在灯上使用 mod_rewrite 制作 seo/canonical url

在 url mod_rewrite 中隐藏扩展名 .php

如何使用 mod_rewrite 显示 SEO 友好的 URL?

mod_rewrite 带问号和 & 符号(使用 PHP)