我在工作时使用 Windows 7 64 位 PC 时遇到了一个奇怪的问题。我管理一些提供 gzip 压缩内容(js、css、html)的 Linux Web 服务器。奇怪的行为是,当我系统中的所有浏览器(Firefox、Chrome、Vivaldi)从这些 Linux 服务器请求内容时(我可以Accept-Encoding: gzip,deflate
清楚地看到标头),它们无法获取内容。所有响应都带有Transfer-Encoding: chunked
,因此内容未压缩。但是,curl
在命令行中使用--compressed
选项运行时,响应带有Content-Type: gzip
和Content-Length
标头,并且按预期进行了 gzip 压缩。在 Windows 2008 R2 服务器中,内容以 gzip 压缩形式提供。
可以保证,在这些 Linux 网络服务器上以 gzip 压缩的形式提供内容可以正常工作。
其中涉及 pfSense 代理,但即使我在代理设置中覆盖它,以便浏览器直接从 Linux 服务器请求内容,行为也是一样的。无论有没有代理,都没有变化。
我使用另一台 Windows 7 64 位 PC 确认了 Firefox 和 Chrome 的问题。因此,我得出结论,操作系统在某种程度上与这种奇怪的浏览器行为有关。
有人可以证实……吗?
答案1
这可能会产生欺骗:为了在一条消息中发送经过 gzip 压缩的文件,服务器需要提供整个文件并知道其大小,而这在您的情况下显然不会发生,正如您自己所说的那样:
在命令行使用该
--compressed
选项运行 curl,响应附带Content-Type: gzip
标题,Content-Length
并且按照预期进行 gzip 压缩。
我认为你的情况是服务器管道将输出传送到 gzip,然后将结果直接传送到浏览器,而无需先将数据写入磁盘以计算文件大小。由于事先不知道大小,服务器别无选择,只能返回包含Transfer-Encoding: chunked
尽可能多的可用部分的流。
当数据可用时,它将以块的形式返回,以便浏览器重新组装。但是,即使是以块的形式接收,接收到的数据仍会被 gzip 压缩。