【问题标题】:Apache mod_rewrite %2B and plus (+) signsApache mod_rewrite %2B 和加号 (+)
【发布时间】:2012-06-12 23:37:03
【问题描述】:

我正在使用 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


    【解决方案1】:

    不,这与引用的问题不太一样。这里的问题特别是加号,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,在许多方面它更容易预测和更简单:

    重写规则 .* index.php [L]

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

    然后在 index.php 中

    $uri = substr($_SERVER['REQUEST_URI'], 1); // 删除前导斜杠

    $qmpos = strpos($uri, '?'); // 有没有问号,如果有的话在哪里

    if ($qmpos !== FALSE) { $uri = substr($uri, 0, $qmpos); } // 只有 q.m. 之前的那位。

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

    if (!empty($decoded)) { $_GET['args'] = $decoded; } // 将结果添加到 $_GET

    解码 original 请求(不包括前导斜杠 - 如果您在层次结构中更深层次会略有不同,但原理是相同的 - 并且不包括任何额外的查询字符串),并且根据 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 代替,它没有好处。

    【讨论】:

    • 谢谢;这是我发现的唯一一个正确回答 URL 本地部分中 + 符号问题的帖子。上面答案中的关键短语是“事实上,单独使用重写规则是不可能的。Apache 在重写之前对 URL 进行解码,但它不理解加号”。
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 2016-01-19
    • 2010-11-09
    • 2010-10-25
    • 2012-11-12
    • 1970-01-01
    • 2011-05-03
    • 2011-02-04
    相关资源
    最近更新 更多