【问题标题】:PHP Query String LimitPHP 查询字符串限制
【发布时间】:2010-10-05 04:09:20
【问题描述】:

我安装了 PHP 5.1.6 (cli),只要 GET 查询字符串超过 128 个字符,它就会失败并出现 HTTP 406 Not Acceptable 错误。有什么建议可以解决这个问题,以便可以使用超过 128 个字符? POST 不是一个选项。

服务器正在返回错误,所以不要认为是浏览器问题。 我认为它是 PHP 而不是 Apache 的原因是它可以很好地处理 HTML 文件。

GET /test.php?phptestof129characterstring-NEW-WOVEN-FENCE-PANELS-GARDEN_W0QQitemZ200303392512QQihZ010QQcategoryZ139954QQtcZphotoQQcmdZViewItem HTTP/1.1 主持人: ***** 用户代理:Mozilla/5.0(Windows;U;Windows NT 5.1;en-GB;rv:1.9.0.5)Gecko/2008120122 Firefox/3.0.5 接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 接受语言:en-gb,en;q=0.5 接受编码:gzip,deflate 接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7 保活:300 连接:保持活动 Cookie:agent_name=Tim HTTP/1.1 406 不可接受 日期:格林威治标准时间 2009 年 2 月 3 日星期二 12:05:33 服务器:Apache/2.2.3(红帽) X-Powered-By: PHP/5.1.6 内容长度:0 连接:关闭 内容类型:文本/html
GET /test.html?phptestof129characterstring-NEW-WOVEN-FENCE-PANELS-GARDEN_W0QQitemZ200303392512QQihZ010QQcategoryZ139954QQtcZphotoQQcmdZViewItem HTTP/1.1 主持人: ***** 用户代理:Mozilla/5.0(Windows;U;Windows NT 5.1;en-GB;rv:1.9.0.5)Gecko/2008120122 Firefox/3.0.5 接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 接受语言:en-gb,en;q=0.5 接受编码:gzip,deflate 接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7 保活:300 连接:保持活动 Cookie:agent_name=Tim HTTP/1.1 200 正常 日期:格林威治标准时间 2009 年 2 月 3 日星期二 12:18:19 服务器:Apache/2.2.3(红帽) 最后修改时间:格林威治标准时间 2008 年 12 月 19 日星期五 15:01:17 ETag:“156960d-221-94be8940” 接受范围:字节 内容长度:545 连接:关闭 内容类型:文本/html

【问题讨论】:

  • 如果您使用 & 和 = 分解查询字符串是否有效?

标签: php apache


【解决方案1】:

您的网络服务器上是否启用了mod_security?这听起来像是它会做的事情。如果是这样,您可以在 <VirtualHost> 块内或使用 v1.x 的 .htaccess 文件在本地禁用

<IfModule mod_security.c>
SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>

2.x 版本有不同的配置语法:

<IfModule mod_security2.c>
    SecRuleEngine Off
</IfModule>

这是一种蛮力的方法,您可能需要阅读documentation 以了解如何允许特定 URI 通过。另见Handling False Positives and Creating Custom Rules

【讨论】:

  • 貌似确实开启了mod_security,但是在htaccess文件中添加“SecFilterEngine Off”和“SecFilterScanPOST off”并没有什么区别。
  • 你有什么版本 - 已经为 v2.x 修改了我的帖子
  • 刚刚尝试了您对 v2 的建议,但也没有这样做。这是 httpd.conf 中的内容: LoadModule security_module /usr/lib/httpd/modules/mod_security.so 不知道我怎么知道它是什么版本?
  • 也许你不能覆盖它.htaccess,也许你可以直接添加到你的 块?
  • 我尝试注释掉 mod_security 的 LoadModule 行并重置 Apache - 当查询字符串超过 128 个字符时,它仍然会生成 406 错误。我认为这意味着 mod_security 可以被排除为错误背后的罪魁祸首?
【解决方案2】:

作为一种变通方法,您可以尝试使用 Javascript 将数据放入 cookie 中。 cookie 将随每个 GET 请求自动发送,并为您提供额外的 2KB 数据空间(如果我没记错的话)。

如果您不想在每个请求中传输该数据,这是非常危险的,所以一般来说我建议不要这样做。

【讨论】:

  • 显然,但认为这超出了问题的范围。我假设他正在使用遗留代码或其他东西。
  • 虽然我的回答确实需要更改服务器端代码,所以也许你是对的。
  • 请求来自第三方应用程序,所以很遗憾这不起作用。这也是我不能使用 POST 的原因。这通常不是问题,因为大多数请求少于 128 个字符,但最近才意识到这个问题。
【解决方案3】:

这是一个很长的镜头,但请尝试添加:

header('Content-Type: text/html');

到您的服务器端代码。如果这没有帮助,请检查您的 Apache 配置,可能是配置错误,因此 PHP 文件无法发出 text/html MIME 类型。如果这没有帮助,如何设置 Apache 以便将 .html 文件视为 PHP 并将目标脚本重命名为 .html?

顺便说一句,来自http://www.checkupdown.com/status/E406.html

客户端(例如您的 Web 浏览器或我们的 CheckUpDown 机器人)可以向 Web 服务器指示它将从 Web 服务器接收回的数据的特征。这是使用以下类型的“接受标头”完成的:

  • Accept:客户端接受的 MIME 类型。例如,浏览器可能只接受它知道如何处理的返回类型的数据(HTML 文件、GIF 文件等)。
  • Accept-Charset:客户端接受的字符集。
  • Accept-Encoding:客户端接受的数据编码,例如它理解的文件格式。
  • Accept-Language:客户接受的自然语言(英语、德语等)。
  • Accept-Ranges:客户端是否接受来自资源的字节范围,即资源的一部分。

如果 Web 服务器检测到它要返回的数据不被客户端接受,它会返回一个包含 406 错误代码的标头。

【讨论】:

    【解决方案4】:

    感谢 Ben 的评论,找到了答案。

    虽然这会产生 406 错误: test.php?129+字符

    这很好用: test.php?data=129+字符

    所以我的猜测是,在第一个例子中 PHP 试图在 $_GET 数组中使用 129 个字符作为名称,而第二个例子只有 4 个字符作为名称,其余的被分配为值,所以数组必须有 128索引名称的字符限制。

    【讨论】:

    • php 5.2.3 没有表现出这种行为
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2011-12-12
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    相关资源
    最近更新 更多