使用apache和cgi时,无法识别Content-Length标头的浏览器

问题描述:

我第一次必须将我正在作为CGI脚本处理的东西包装起来。我在浏览器(无论是Chrome浏览器还是Firefox浏览器)都无法识别Content-Length标题并向用户指出“未知”大小。使用apache和cgi时,无法识别Content-Length标头的浏览器

enter image description here

当我测试这与Linux太wget,该工具能够识别的大小就好了。

当我手动测试这虽然openssl s_client -connect我得到以下标题:

从Web服务器的精确输出如下:

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无法知道它在发送标题时会发生多少变化。这些文件每个都是1/GB,因此在开始发送之前它不能/不会缓存gzip内容,因此无法知道文件大小。这意味着它必须切换到Transfer-Encoding: chunked

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

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