我有一个PHP驱动的网站,它使用输出缓冲,生成整个页面并在发送实际页面内容之前吐出几个标题(Content-Type
和Content-Length
)。
这在我的本地Apache服务器上工作正常,但是当我将其上传到我的Web主机(也是Apache)时,它失败并出现500内部服务器错误,我最终追溯到Content-Length
标头。我只是删除了标题(这不是很重要),因为它可以正常工作。
现在我只是好奇为什么会发生这种情况 - 是否有某种服务器设置禁止脚本添加此特定标头?
答案 0 :(得分:1)
我可能错了,但我认为任何一个可选的PHP安全设置或许多服务器使用的Suhosin PHP保护系统都不允许这样做。
我想我记得曾经读过一些关于Content-Length
和实际内容长度之间的不匹配如何用于漏洞的东西,因此,PHP + Suhosin和浏览器的xmlHttpRequest
Javascript对象都坚持设置那个标题给你。
答案 1 :(得分:0)
通常,如果在身体的某些部分已经发送后设置了响应标头,则会出现错误。在生产中,内容的大小可能大于输出缓冲区,因此服务器开始向客户端发送数据。这可能会导致您描述的错误。
尝试回答这些问题,您应该最终得到解决方案 -
答案 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...
我的内容长度仅用于我的实际响应文本等