【问题标题】:How do you configure Apache/PHP to accept slashes in query strings?如何配置 Apache/PHP 以接受查询字符串中的斜杠?
【发布时间】:2010-10-02 12:03:46
【问题描述】:

我有两台运行 PHP 的 Apache 服务器。一个接受查询字符串中的正斜杠并以预期的方式将其传递给 PHP,例如:

http://server/index.php?url=http://foo.bar

有效,在 PHP 中这个表达式为真:

$_REQUEST['url'] == "http://foo.bar"

然而,在 other Apache 服务器中,相同的 URL 会导致 403 Forbidden 错误!请注意,如果查询字符串正确地进行了 URL 转义(即使用 %2F 而不是正斜杠),那么一切正常。

显然 Apache 或 PHP 配置有一些差异导致了这种情况,但我不知道是什么原因!

我想在这两种情况下接受这种形式的 URL,而不是拒绝它。

【问题讨论】:

  • 你检查过日志文件吗?
  • 我 99.9% 确定我以前遇到过这种情况,但我一生都记不起我做了什么来解决它。我现在正在环顾四周……

标签: php apache apache2 query-string


【解决方案1】:

这里的一些帖子表明 OP 的用法是错误的,这是错误的。

扩展 Sam152 的评论,查询字符串允许同时包含 ?和 / 字符,请参阅http://www.ietf.org/rfc/rfc3986.txt 的第 3.4 节,这基本上是 Tim Berners-Lee 和朋友编写的规范 web 应该如何运行的规范。

问题在于编写不当(或配置不当或滥用)的解析器将查询字符串斜杠解释为分隔路径组件。

我已经看到了用于解析 URL 的 PHP 的 pathinfo 函数的示例。 Pathinfo 不是用来解析 URL 的。但是,您可以使用 parse_url 提取路径,然后使用 fileinfo 从路径中检索详细信息。您将看到 parse_url 处理 / 和 ?在查询字符串中就好了。

在任何情况下,总的问题是对这个领域的全面了解甚少,即使是经验丰富的开发人员也是如此,而且大多数人(直到最近还包括我自己)只是假设文件名之后的任何内容都必须进行 urlencoded,这显然是如果您考虑标准,则为 false。

tl;dr 阅读规范 :)

【讨论】:

    【解决方案2】:

    http://server/index.php?url=http://foo.bar 不是有效的网址。您必须对斜杠进行编码。我认为浏览器会自动执行此操作,所以也许您正在使用不同的浏览器进行测试?

    或者可能是AllowEncodedSlashes 设置?

    【讨论】:

    • 查询字符串中允许使用斜杠,根据 RFC:ietf.org/rfc/rfc3986.txt
    • AllowEncodedSlashes 仅当编码斜线在路径部分时才需要(默认禁止)
    【解决方案3】:

    您是否安装了mod_security?看到这个帖子:

    403 Forbidden on PHP page called with url encoded in a $_GET parameter

    【讨论】:

      【解决方案4】:

      在您的 Apache 配置中:

      AllowEncodedSlashes On
      

      有关详细信息,请参阅文档:
      http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes

      编辑:嗯,这可能是你已经在工作的......我遇到了同样的问题,最终为我解决的只是使用$_SERVER['REQUEST_URI'],因为它有我需要的数据。

      【讨论】:

        【解决方案5】:

        你没有指定 PHP 对这个 url 做了什么。它是重定向到这个页面还是尝试阅读它?

        可能有一些 mod_rewrite 规则来删除双斜杠,或者出于其他目的,它试图将其重定向到不应该的地方。

        可能是在 http:// 之前没有 ^ 的正则表达式

        【讨论】:

        • PHP 确实获得了该页面——Apache 会抛出 403 异常错误。
        【解决方案6】:

        请注意,如果查询字符串正确地进行了 URL 转义(即使用 %2F 而不是正斜杠),那么一切正常。

        因此,当查询字符串格式正确时它可以工作,而当它不正确时它不起作用。有什么问题?

        【讨论】:

          【解决方案7】:

          这听起来像是另一种默认的magic_quotes_gpc。在导致问题的服务器上检查 php.ini 并确保

          magic_quotes_gpc = Off
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-26
            • 2012-06-23
            • 1970-01-01
            • 2016-05-10
            相关资源
            最近更新 更多