2010-04-18 75 views
3

我最近開始在我的網站上使用gzip,它在除Opera之外的所有瀏覽器上運行得很好,因爲它提供了一個錯誤,指出由於數據損壞而無法解壓內容。從我可以從測試和搜索結果中收集的信息,可能會同時使用gzip和分塊傳輸編碼。在請求像css文件這樣的小文件時沒有錯誤的事實也指出了這一點。使用分塊傳輸編碼和gzip

這是一個已知問題還是有沒有其他的東西,我沒有想過?

有人還提到它可能與發送Content-Length標題有關。

這裏是我的代碼的最相關部分的簡化版本:

$contents = ob_get_contents(); 
ob_end_clean(); 
header('Content-Encoding: '.$encoding); 
print("\x1f\x8b\x08\x00\x00\x00\x00\x00"); 
$size = strlen($contents); 
$contents = gzcompress($contents, 9); 
$contents = substr($contents, 0, $size); 
print($contents); 
exit(); 
+2

你的第一個輸出是什麼意思,你爲什麼在這種情況下使用'substr'? – Gumbo 2010-04-30 06:57:42

回答

7

gzip和分塊編碼一起使用的所有網絡上的時間,所以我懷疑問題是由自己一手造成。

如果使用分塊編碼,則不應發送Content-Length標頭。另外,當你協商gzip時,你應該發送Vary:Accept-Encoding(在壓縮和未壓縮的響應上),並且如果你發送了ETag,它們需要與壓縮和未壓縮的響應有所不同。

嘗試通過http://redbot.org/運行URL - 它檢查gzip編碼的一些常見問題。

2

理想情況下,您應該檢查客戶端的請求頭以確保它支持編碼響應。要查找的標題是:「Accept-Encoding:gzip,deflate」。您還應該檢查客戶端是否使用HTTP 1.1。