我安装了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
答案 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个索引名称的字符限制。