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

时间:2009-01-20 16:41:22

标签: php apache apache2 query-string

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

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

有效,在PHP中,这个表达式是正确的:

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

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

显然,导致这种情况的Apache或PHP配置存在一些差异,但我无法弄清楚是什么!

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

7 个答案:

答案 0 :(得分:7)

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

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

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

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

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

tl; dr阅读规范:)

答案 1 :(得分:1)

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

或许这是AllowEncodedSlashes设置?

答案 2 :(得分:1)

在Apache配置中:

AllowEncodedSlashes On

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

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

答案 3 :(得分:1)

您是否安装了mod_security?见这个主题:

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

答案 4 :(得分:0)

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

magic_quotes_gpc = Off

答案 5 :(得分:0)

你没有指定PHP对这个网址的作用。它是重定向到此页面还是尝试阅读?

可能有一些mod_rewrite规则要删除双斜杠,或者出于某些其他目的,它会尝试将其重定向到它不应该的位置。

在http://

之前,可能没有^的正则表达式

答案 6 :(得分:0)

  

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

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