【问题标题】:PHP curl and gzip: browser not handling gzip responsePHP curl 和 gzip:浏览器不处理 gzip 响应
【发布时间】:2011-05-16 12:40:09
【问题描述】:

I) 我的代理服务器将它从客户端接收到的 Accept-Encoding 标头按原样传递给我的后端内容服务器。从后端服务器接收到的数据只需使用 PHP 回显(无需单独处理标头)发送到请求浏览器。但是,数据在浏览器中显示为原始二进制数据。

如果我没有将任何 Accept-Encoding 传递给我的内容服务器,那么一切都很好。

既然浏览器接受 GZIP 数据,为什么我的代理服务器需要对其进行解码 - 为什么不直接将 gzip 数据传回浏览器工作?与其在代理服务器上压缩数据,我是否缺少一些可以使事情正常进行的设置?


II)根据stillstanding的建议,我尝试了一种新方法(但现在我更加困惑,因为它有自己的问题)!。

我用过

....
curl_setopt($curl_handle, CURLOPT_HEADER, 1);
$result = curl_exec($curl_handle);
curl_close($curl_handle);

我没有回应结果,而是这样做:

list($headers,$content)=explode("\r\n\r\n",$result,2);
foreach (explode("\r\n",$headers) as $hdr) {
     header($hdr);
}
echo $content;

现在,浏览器识别出数据已被 gzip 压缩,但提供了保存 gzip 文件而不是显示内容的选项。如前所述,我只是传递了浏览器给我的 Accept-Encoding,那么为什么会出现问题?

谢谢

日本

PS:(我在 SO 上看到了一些与 curl gzip 相关的其他问题,但它们无法解决我的疑问)。

【问题讨论】:

  • 浏览器是否接收到“Content-Encoding”标头?
  • 没有检查。既然你提到了,很可能不是。我该如何检查?另外:我的后端服务器不应该发送 Content-Encoding 标头吗?还是我的代理服务器正在吃掉它? AFAIK,我的后端服务器认为请求来自浏览器,而不是代理。
  • 要检查 Chrome 中的标题:开发人员工具 (CTRL+ALT+I),从顶部选项卡中选择“资源”(如果必须启用面板),然后选择“文档”(正好在“资源”下方"),然后可能是左侧文档列表中唯一的项目,最后是右侧窗格中的“标题”。
  • 谢谢。正在并行查找,并且能够在 chrome 中查看标题。

标签: php apache curl http-headers gzip


【解决方案1】:

cmets、更多的谷歌搜索和反复试验帮助我解决了这个问题。

我的 curl 设置为(无需我做任何事情)自动缩小后端服务器发送的响应。所以浏览器收到的标头说“gzip”,但收到的数据不是。

通过以下方式阻止 curl 对响应进行放气:

curl_setopt($curl_handle, CURLOPT_ENCODING, "identity");

现在我可以按原样回显结果并且工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多