2017-07-31 61 views
0

我第一次必須將我正在作爲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 

任何人都可以提出缺什麼/格式錯誤?

回答

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>。這將要求我在發送之前計算壓縮後的大小。