使用 apache 和 cgi 时浏览器无法识别 Content-Length header

Browsers not recognising Content-Length header when using apache and cgi

这是我第一次不得不将正在处理的内容打包为 CGI 脚本。我在使用浏览器(Chrome 和 Firefox)时遇到问题,无法识别 Content-Length header 并向用户说明大小 "unknown"。

当我也用 linux 测试它时 wget,该工具可以很好地识别尺寸。

当我手动测试时 openssl s_client -connect 我得到以下 headers:

webserver的精确输出如下:

HTTP/1.1 200 OK
Date: Sun, 30 Jul 2017 20:12:20 GMT
Server: Apache/2.4.25 (Ubuntu) mod_fcgid/2.3.9 OpenSSL/1.0.2g
Content-Disposition: attachment; filename=foo.000000000G-000000001G.foofile.txt;
Content-Length: 501959790
Vary: Accept-Encoding
Content-Type: text/plain;charset=utf-8

任何人都可以建议丢失/格式错误的内容吗?

终于破解了。

这是由于 Apache 做了一些意外的事情造成的。 Apache 正在动态压缩 CGI 脚本的输出(使用 Content-Encoding: gzip 发送)。这会改变文件的大小,但 Apache 在发送 header 时无法知道文件的大小。每个文件都是 1/GB,因此它不能/不会在开始发送之前缓存 gzip 内容,因此无法知道文件大小。这意味着它必须切换到 Transfer-Encoding: chunked

解决此问题的一种方法是在 header 中设置 Content-Encoding: none 以禁用 Apache 压缩内容。这确实意味着 1/2 GB 的文件需要更长的时间才能发送。

另一个可能是手动 gzip 我的 cgi 脚本中的内容并设置 Content-Encoding: gzipContent-Length: <gzipped size>。这需要我在发送前计算出压缩后的大小。