代码之家  ›  专栏  ›  技术社区  ›  Jason Cohen

如何配置Apache/PHP以接受查询字符串中的斜线?

  •  6
  • Jason Cohen  · 技术社区  · 17 年前

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

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

    在PHP中,此表达式为true:

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

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

    显然,Apache或PHP的配置存在一些差异,导致了这一点,但我不知道是什么!

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

    7 回复  |  直到 13 年前
        1
  •  7
  •   Alex    14 年前

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

    扩展Sam152的注释,查询字符串是否允许同时包含这两个?和/字符,见第3.4节 http://www.ietf.org/rfc/rfc3986.txt ,这基本上是蒂姆·伯纳斯-李和朋友们编写的规范,指导网络应该如何运作。

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

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

    无论如何,总体问题是,即使在经验丰富的开发人员中,对这一领域的全面理解也很差,大多数人(包括我自己,直到最近)只是假设文件名之后的任何内容都必须进行url编码,如果考虑到标准,这显然是错误的。

    太长了,读不下去了阅读规范:)

        2
  •  0
  •   troelskn    17 年前

    http://server/index.php?url=http://foo.bar 不是有效的url。你必须对斜线进行编码。我认为浏览器会自动完成这项工作,所以也许你在用不同的浏览器进行测试?

    或者也许是 AllowEncodedSlashes 设置?

        3
  •  0
  •   Community Mohan Dere    8 年前
        4
  •  0
  •   Ian    14 年前

    在Apache配置中:

    AllowEncodedSlashes On
    

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

    编辑:嗯,这可能是你已经在做的。..我也有同样的问题,最终为我解决的是使用 $_SERVER['REQUEST_URI'] 因为那里有我需要的数据。

        5
  •  -1
  •   OIS    17 年前

    您无需指定PHP如何处理此url。它会重定向到此页面还是尝试阅读它?

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

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

        6
  •  -1
  •   jmucchiello    17 年前

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

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

        7
  •  -1
  •   UberDragon    14 年前

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

    magic_quotes_gpc = Off
    
    推荐文章