我有两个运行PHP的Apache服务器。一个接受查询字符串中的正斜杠,并以预期的方式将其传递给PHP,例如:
http://server/index.php?url=http://foo.bar
有效,在PHP中,这个表达式是正确的:
$_REQUEST['url'] == "http://foo.bar"
但是,在其他 Apache服务器中,相同的网址会导致403 Forbidden
错误!请注意,如果查询字符串已正确进行URL转义(即使用%2F
而不是正斜杠),那么一切正常。
显然,导致这种情况的Apache或PHP配置存在一些差异,但我无法弄清楚是什么!
我想在这两种情况下接受这种形式的网址,而不是拒绝它。
答案 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而不是正斜杠),那么一切正常。
因此,当查询字符串格式正确时它可以工作,而当它没有时,它不起作用。有什么问题?