我使用apache / mod_rewrite重写URL,但是加号有问题。
有以下规则..。
RewriteRule ^/(.+[^/])/?$ http://localhost:8080/app/home?tag=$1 [P,L] 两者均:
http://localhost/1+1 and http://localhost/1%2B2最后作为
uri=http://localhost:8080/app/home, args=tag=1+2因此,在这两种情况下,应用程序将加号转换为一个空格,这样它就不能再区分空格和加号了。
如果我使用"B“标志,那么在这两种情况下+符号都会被转换为%2B,并且应用程序最终会遇到相同的问题,但是相反(空格和加号都是加号)
有没有办法让apache正确地将%2B转义成加号而不是空格?
我读过一些关于mod_security的文章,但我没有使用它,所以我不确定是否有其他安全机制导致了这种情况?
任何帮助都将不胜感激!
发布于 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代替,它不做加法。
https://stackoverflow.com/questions/2523506
复制相似问题