http accept 傳輸編碼:gzip與Content-Encoding:gzip



post gzip (2)

當涉及到是否要做時,目前的狀況如何?

Transfer-Encoding: gzip

或者a

Content-Encoding: gzip

當我想讓有限帶寬的客戶 表示願意接受壓縮響應時服務器最終決定是否壓縮

後者就是Apache的mod_deflate和IIS所做的,如果你讓它處理壓縮。 根據要壓縮內容的大小,它將執行額外的Transfer-Encoding: chunked

它還將包括一個Vary: Accept-Encoding ,它已經暗示了這個問題。 Content-Encoding似乎是實體的一部分,因此改變Content-Encoding等於實體的變化,即不同的Accept-Encoding頭意味著例如緩存不能使用其緩存版本的其他相同的實體。

有沒有一個明確的答案,我已經錯過了(這不是埋在一個apache新聞組的長線程中的消息裡面)?

我目前的印像是:

  • Transfer-Encoding實際上是通過現有的服務器和客戶端實現進行Content-Encoding的主要方式
  • 由於內容編碼的語義影響,內容編碼帶有一些問題(當透明地壓縮響應時,服務器應該如何處理ETag ?)
  • 原因是chicken'n'egg:瀏覽器不支持它,因為服務器不是因為瀏覽器不支持

所以我假設正確的方式是一個Transfer-Encoding: gzip (或者,如果我額外地分塊,它將成為 Transfer-Encoding: gzip, chunked )。 在這種情況下沒有任何理由觸及VaryETag或任何其他頭部,因為它是傳輸級別的東西。

目前我並不太在意Transfer-Encoding的“逐跳”特性,這是其他人似乎首先關心的問題,因為代理可能會解壓縮並將未壓縮的內容轉發給客戶端。 但是,如果原始請求具有適當的Accept-Encoding標頭,那麼在我知道的所有瀏覽器都是給定的情況下,代理可能就像原來那樣(壓縮)。

順便說一句,這個問題至少有十年曆史,請參閱https://bugzilla.mozilla.org/show_bug.cgi?id=68517

任何關於此的澄清將不勝感激。 無論是在哪些方面都被認為符合標準並被認為是實用的。 例如,僅支持透明“內容編碼”的HTTP客戶端庫將成為違背實用性的論點。

https://src-bin.com


Answer #1

RFC 2616中定義的正確用法實際上是在野外實現的,用於客戶端發送Accept-Encoding請求頭(客戶端可以指定多種編碼)。 然後,服務器可以根據客戶端支持的編碼對響應進行編碼(如果文件數據尚未存儲在該編碼中),則在Content-Encoding響應頭中指出正在使用哪種編碼。 然後,客戶端可以基於Transfer-Encoding (即, chunked )從套接字讀取數據,然後基於Content-Encoding (即: gzip )對其進行解碼。

因此,在你的情況下,客戶端會發送Accept-Encoding: gzip請求頭,然後服務器可能決定壓縮(如果還沒有的話)並發送Content-Encoding: gzip和可選的Transfer-Encoding: chunked響應頭。

而且, Transfer-Encoding標頭可用於請求中,但僅適用於HTTP 1.1,這要求客戶端和服務器實現都支持雙向編碼。

ETag唯一標識服務器上的資源數據,而不是實際傳輸的數據。 如果給定的URL資源更改其ETag值,則意味著該資源的服務器端數據已更改。


Answer #2

引用RFC 2616的作者之一Roy T. Fielding的話說:

以不一致的方式即時改變內容編碼(既不“永不”也不是永遠),使得以後關於該內容(例如,PUT或條件GET)的請求無法被正確處理,這當然是為什麼執行動態內容編碼是一個愚蠢的想法,為什麼我將Transfer-Encoding添加到HTTP中,作為在不改變資源的情況下進行即時編碼的正確方法。

資料來源: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31 : https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31

換句話說:不要進行即時的 Content-Encoding,而是使用Transfer-Encoding!

編輯:也就是說, 除非您想將gzip內容提供給僅了解Content-Encoding的客戶端 。 不幸的是,這似乎是其中的大部分。 但請注意,您離開了規範的領域,並可能遇到諸如Fielding和其他人所提及的問題,例如涉及緩存代理時。





transfer-encoding