PHP查询字符串限制

时间:2009-02-03 14:39:56

标签: php apache

我安装了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
Host: *****
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: agent_name=Tim

HTTP/1.1 406 Not Acceptable
Date: Tue, 03 Feb 2009 12:05:33 GMT
Server: Apache/2.2.3 (Red Hat)
X-Powered-By: PHP/5.1.6
Content-Length: 0
Connection: close
Content-Type: text/html

GET /test.html?phptestof129characterstring-NEW-WOVEN-FENCE-PANELS-GARDEN_W0QQitemZ200303392512QQihZ010QQcategoryZ139954QQtcZphotoQQcmdZViewItem
HTTP/1.1
Host: *****
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: agent_name=Tim

HTTP/1.1 200 OK
Date: Tue, 03 Feb 2009 12:18:19 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Fri, 19 Dec 2008 15:01:17 GMT
ETag: "156960d-221-94be8940"
Accept-Ranges: bytes
Content-Length: 545
Connection: close
Content-Type: text/html

4 个答案:

答案 0 :(得分:2)

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

<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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

BTW,来自http://www.checkupdown.com/status/E406.html

  

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

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

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

答案 3 :(得分:0)

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

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

这很好用: test.php的?数据= 129个+字符

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