6

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

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

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

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

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

很明显,导致这种情况的 Apache 或 PHP 配置存在一些差异,但我不知道是什么原因!

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

4

7 回答 7

7

这里的一些帖子表明 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,如果您这样做,这显然是错误的考虑标准。

tl;博士阅读规范:)

于 2011-11-29T02:05:12.250 回答
0

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

或者可能是AllowEncodedSlashes设置?

于 2009-01-20T19:36:05.627 回答
0

在您的 Apache 配置中:

AllowEncodedSlashes On

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

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

于 2009-01-20T19:46:46.133 回答
0

mod_security安装了吗?看到这个线程:

403 Forbidden on PHP page called with url encoding in a $_GET 参数

于 2010-01-05T22:22:15.557 回答
-1

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

magic_quotes_gpc = Off
于 2009-01-20T17:37:25.380 回答
-1

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

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

也许在 http:// 之前没有 ^ 的正则表达式

于 2009-01-20T19:21:23.830 回答
-1

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

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

于 2009-01-20T19:41:21.230 回答