gpt4 book ai didi

Apache mod_rewrite %2B 和加号 (+)

转载 作者:行者123 更新时间:2023-12-02 09:38:13 27 4
gpt4 key购买 nike

我正在使用 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 的内容,但我没有使用它,所以我不确定是否有其他安全机制导致了这种情况?

任何帮助将不胜感激!

最佳答案

不,这与引用的问题不太一样。这里的问题具体是加号和 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".

加号由 PHP 解码为查询字符串的 $_GET 数组(或任何相关的语言机制),因为浏览器中的表单处理程序将它们放入其中。因此 Apache 在应用重写之前会将 %2B 转换为 +,并保留 + 本身,这意味着您无法区分。

当然,有人可能会争辩说,在此类 URL 中将 + 用作空格根本无效,应该仅使用 %20。但是,如果您无法控制它们的生成,那么您一定会看到它们。但浏览器不会自动生成它们。

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

RewriteRule .* index.php [L]

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

然后在index.php

$uri = substr($_SERVER['REQUEST_URI'], 1); // remove leading slash

$qmpos = strpos($uri, '?'); // is there a question mark, if so where

if ($qmpos !== FALSE) { $uri = substr($uri, 0, $qmpos); } // only the bit before q.m.

$decoded = urldecode($uri); // decode the part before the URL

if (! empty($decoded)) { $_GET['args'] = $decoded; } // add result to $_GET

解码原始请求(不包括前导斜杠 - 如果您位于层次结构的更深处,情况会略有不同,但原理是相同的 - 并且不包括任何其他查询字符串),并且根据 PHP 的正常规则解码 args 参数并将其放入 $_GET 中,以便您可以以通常的方式将其与其余 $_GET 查询字符串参数一起处理。

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

在您的特定情况下,您实际上根本不希望在 PHP 中对加号进行解码。没关系,使用 rawurldecode 代替,这没有好处。

关于Apache mod_rewrite %2B 和加号 (+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2523506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com