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

时间:2017-07-31 13:23:08

标签: apache http http-headers cgi

我第一次将我正在处理的东西包装成CGI脚本。我无法使用浏览器(Chrome和Firefox)无法识别Content-Length标头并向用户说明“未知”的大小。

enter image description here

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

当我通过openssl s_client -connect手动测试时,我得到以下标题:

网络服务器的精确输出如下:

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

有人可以建议丢失/格式错误吗?

1 个答案:

答案 0 :(得分:0)

最终破解了。

这是由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>。这将要求我在发送之前计算出压缩的大小。