Content-Length标头和内部服务器错误

时间:2010-09-04 21:38:09

标签: php apache http

我有一个PHP驱动的网站,它使用输出缓冲,生成整个页面并在发送实际页面内容之前吐出几个标题(Content-TypeContent-Length)。

这在我的本地Apache服务器上工作正常,但是当我将其上传到我的Web主机(也是Apache)时,它失败并出现500内部服务器错误,我最终追溯到Content-Length标头。我只是删除了标题(这不是很重要),因为它可以正常工作。

现在我只是好奇为什么会发生这种情况 - 是否有某种服务器设置禁止脚本添加此特定标头?

3 个答案:

答案 0 :(得分:1)

我可能错了,但我认为任何一个可选的PHP安全设置或许多服务器使用的Suhosin PHP保护系统都不允许这样做。

我想我记得曾经读过一些关于Content-Length和实际内容长度之间的不匹配如何用于漏洞的东西,因此,PHP + Suhosin和浏览器的xmlHttpRequest Javascript对象都坚持设置那个标题给你。

答案 1 :(得分:0)

通常,如果在身体的某些部分已经发送后设置了响应标头,则会出现错误。在生产中,内容的大小可能大于输出缓冲区,因此服务器开始向客户端发送数据。这可能会导致您描述的错误。

尝试回答这些问题,您应该最终得到解决方案 -

  1. 使用http代理并检查错误响应。你有一些HTML内容和500错误代码吗?
  2. 输出缓冲区的大小是多少,响应的大小是否大于缓冲区大小?
  3. 与本地机器相比,生产中的缓冲区大小是否相同?

答案 2 :(得分:0)

不确定这是否相关,但我遇到了一个问题,即设置 Content-Length 导致 Postman 在我的开发机器上返回“解析错误:服务器返回格式错误的响应”。我发现这是由于在输出中添加了一个警告,导致它与我提供的内容长度不同。

例如输出是

<br />
<b>Warning</b>:  Undefined array key "my typo" in <b>path and filename.php</b> 
on line <b>123</b><br />
... my actual response here...

我的内容长度仅用于我的实际响应文本等