首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache mod_rewrite %2B和+ (+)符号

Apache mod_rewrite %2B和+ (+)符号
EN

Stack Overflow用户
提问于 2010-03-26 13:23:43
回答 1查看 6.5K关注 0票数 7

我使用apache / mod_rewrite重写URL,但是加号有问题。

有以下规则..。

代码语言:javascript
复制
RewriteRule ^/(.+[^/])/?$ http://localhost:8080/app/home?tag=$1 [P,L] 

两者均:

代码语言:javascript
复制
http://localhost/1+1 and http://localhost/1%2B2

最后作为

代码语言:javascript
复制
uri=http://localhost:8080/app/home, args=tag=1+2

因此,在这两种情况下,应用程序将加号转换为一个空格,这样它就不能再区分空格和加号了。

如果我使用"B“标志,那么在这两种情况下+符号都会被转换为%2B,并且应用程序最终会遇到相同的问题,但是相反(空格和加号都是加号)

有没有办法让apache正确地将%2B转义成加号而不是空格?

我读过一些关于mod_security的文章,但我没有使用它,所以我不确定是否有其他安全机制导致了这种情况?

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2012-06-12 15:37:03

不,这和提到的问题不太一样。这里的问题是具体加上符号,而Apache: mod_rewrite: Spcaes & Special Characters in URL not working的答案并没有解决这个问题。

斜杠也有一个问题,请参阅http://httpd.apache.org/docs/current/mod/core.html#allowencodedslashes (但您确实需要访问Apache才能做到这一点-- .htaccess不会这么做)。

事实上,单独使用重写规则是不可能的。Apache在重写之前对URL进行解码,但是它不理解的加上符号:http://example.com/a+b.html不会传递一个名为

"a b.html“。

由于浏览器中的表单处理程序将加号解码为$_GET数组(或任何相关的语言机制),用于查询字符串。因此,Apache将在应用重写之前将%2B转换为+,而不使用+本身,这意味着您无法区分两者之间的区别。

当然,人们可能会说,在这样的URL中,用作空间的+是无效的,应该只使用%20。但是,如果你不能控制它们的生成,你就一定会看到它们。不过,浏览器不会自动生成它们。

答案是DIY,而且在许多方面它更可预测和更简单:

RewriteRule .* index.php L

因此,所有东西都会变成index.php,因此不会尝试构造查询字符串。如果您想要排除某些模式,例如那些带有斜杠的模式,或者存在显式文件的模式,则适用明显的修改。例如RewriteCond %{REQUEST_FILENAME} !-f

然后在index.php

$uri =substr($_$uri‘remove’,1);//删除前导斜杠

$qmpos = strpos($uri,'?');//在哪里有问号?

if ($qmpos !== FALSE) { $uri = substr($uri,0,$qmpos);} //仅在q.m之前。

$decoded = urldecode($uri);//解码URL之前的部分

如果(!)空($decoded)){ $_GET‘’args‘= $decoded;} //向$_GET添加结果

对原始请求(不包括前面的斜杠)进行解码--如果您深入到层次结构中,则会略有不同,但原理是相同的--排除任何额外的查询字符串),并根据PHP的常规规则对args参数进行解码,并将其放入$_GET中,以便您可以按照通常的方式处理它和其他$_GET查询字符串参数。

我认为这应该适用于空URL (http://example.com/)或只有查询字符串(http://example.com/?foo=1)、简单案例(http://example.com/bar)和带有查询字符串的情况(http://example.com/bar?foo=1)。毫无疑问,类似的方法将适用于其他语言。

在您的特殊情况下,实际上您根本不希望PHP中的加号被解码。这很好,用rawurldecode代替,它不做加法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2523506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档