使用apache和cgi时,无法识别Content-Length标头的浏览器
问题描述:
我第一次必须将我正在作为CGI脚本处理的东西包装起来。我在浏览器(无论是Chrome浏览器还是Firefox浏览器)都无法识别Content-Length标题并向用户指出“未知”大小。使用apache和cgi时,无法识别Content-Length标头的浏览器
当我测试这与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: gzip
和Content-Length: <gzipped size>
。这将要求我在发送之前计算压缩后的大小。