我的 Windows 7 64 位元電腦在工作時遇到了一個奇怪的問題。我管理一些提供 gzip 壓縮內容(js、css、html)的 Linux Web 伺服器。奇怪的行為是,當我係統中的所有瀏覽器(Firefox、Chrome、Vivaldi)向這些 Linux 伺服器請求內容時(我可以Accept-Encoding: gzip,deflate
很好地看到標頭),它們卻無法取得它。所有回應都帶有Transfer-Encoding: chunked
,因此內容不會被壓縮。但是,curl
使用該選項在命令列運行時--compressed
,回應會附帶Content-Type: gzip
標題Content-Length
,並且按預期進行 gzip 壓縮。在 Windows 2008 R2 伺服器上,內容以 gzip 形式提供。
以 gzip 形式提供內容在這些 Linux Web 伺服器上可以正常運作,這是可以保證的。
涉及到 pfSense 代理,但即使我在代理設定中覆蓋它以便瀏覽器直接從 Linux 伺服器請求內容,行為也是一樣的。無論有或沒有代理,都沒有變化。
我在另一台 Windows 7 64 位元電腦上確認了 Firefox 和 Chrome 的問題。因此,我得出的結論是,作業系統在某種程度上參與了這種奇怪的瀏覽器行為。
有人可以確認嗎...?
答案1
這可能是欺騙性的:為了在一條訊息中發送經過 gzipp 處理的文件,伺服器需要提供整個文件並知道其大小,正如您自己所說,這在您的情況下顯然不會發生:
使用選項在命令列運行curl
--compressed
,回應帶有標題Content-Type: gzip
,Content-Length
並且按預期進行了gzip 壓縮。
我認為在你的情況下伺服器管道輸出到 gzip,然後將結果直接透過管道傳輸到瀏覽器,而無需先將資料寫入磁碟來計算檔案大小。由於事先不知道大小,伺服器別無選擇,只能傳回包含Transfer-Encoding: chunked
可用部分的流。
當資料可用時,它將以區塊的形式返回,由瀏覽器重新組裝。但是,即使以區塊形式接收,接收到的資料仍然經過 gzipp 壓縮。