Bagaimana keadaan saat ini tentang apakah harus melakukan
Transfer-Encoding: gzip
atau a
Content-Encoding: gzip
ketika saya ingin mengizinkan klien dengan misalnya bandwidth terbatas untuk memberi sinyal kesediaan mereka untuk menerima respons terkompresi dan server memiliki keputusan akhir apakah akan mengompres atau tidak .
Yang terakhir adalah apa yang dilakukan misalnya mod_deflate dan IIS Apache, jika Anda membiarkannya menangani kompresi. Bergantung pada ukuran konten yang akan dikompresi, itu akan melakukan tambahan Transfer-Encoding: chunked
.
Ini juga akan menyertakan a Vary: Accept-Encoding
, yang sudah mengisyaratkan masalah. Content-Encoding
tampaknya menjadi bagian dari entitas, jadi mengubah Content-Encoding
jumlah menjadi perubahan entitas, yaitu Accept-Encoding
header yang berbeda berarti misalnya cache tidak dapat menggunakan versi cache dari entitas yang identik.
Apakah ada jawaban pasti tentang ini yang saya lewatkan (dan itu tidak terkubur di dalam pesan di utas panjang di beberapa newsgroup Apache)?
Kesan saya saat ini adalah:
- Transfer-Encoding sebenarnya akan menjadi cara yang tepat untuk melakukan apa yang sebagian besar dilakukan dengan Content-Encoding oleh server yang ada dan implementasi klien
- Content-Encoding, karena implikasi semantiknya, membawa beberapa masalah (apa yang harus dilakukan server
ETag
ketika secara transparan memampatkan respons?) - Alasannya adalah ayam'n'egg: Browser tidak mendukungnya karena server tidak mendukungnya karena browser tidak
Jadi saya berasumsi bahwa cara yang benar adalah a Transfer-Encoding: gzip
(atau, jika saya juga memotong tubuh, itu akan menjadi Transfer-Encoding: gzip, chunked
). Dan tidak ada alasan untuk menyentuh Vary
atau ETag
atau tajuk lain dalam hal ini karena ini adalah hal tingkat pengangkutan.
Untuk saat ini saya tidak terlalu peduli tentang 'hop-by-hop'-ness Transfer-Encoding
, sesuatu yang tampaknya menjadi perhatian orang lain pertama dan terutama, karena proxy mungkin membuka kompresi dan meneruskan tanpa kompresi ke klien. Namun, proxy mungkin juga meneruskannya sebagaimana adanya (dikompresi), jika permintaan asli memiliki Accept-Encoding
tajuk yang tepat , yang dalam kasus ini semua browser yang saya tahu diberikan.
Ngomong-ngomong, masalah ini setidaknya sudah berumur satu dekade, lihat misalnya https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .
Klarifikasi apa pun tentang ini akan dihargai. Baik dalam hal apa yang dianggap memenuhi standar dan apa yang dianggap praktis. Misalnya, pustaka klien HTTP yang hanya mendukung "Content-Encoding" transparan akan menjadi argumen yang menentang kepraktisan.
sumber
Transfer-Encoding:gzip
, meskipun baris perintah curl mengerti . Agar aman, kirim keduanya, kecuali Anda menggabungkan chunked dan gzip.Jawaban:
Mengutip Roy T.Fielding , salah satu penulis RFC 2616:
Sumber: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31
Dengan kata lain: Jangan lakukan Pengkodean Konten dengan cepat , gunakan Pengodean Transfer sebagai gantinya!
Sunting: Yaitu, kecuali Anda ingin menyajikan konten gzip kepada klien yang hanya memahami Pengkodean Konten . Yang, sayangnya, tampaknya sebagian besar dari mereka. Namun ketahuilah bahwa Anda meninggalkan ranah spesifikasi dan mungkin mengalami masalah seperti yang disebutkan oleh Fielding serta yang lainnya, misalnya saat proxy cache terlibat.
sumber
TE: gzip
. Dan kemudian server Anda harus pergi ke rute Transfer-Encoding. Jika klien hanya berkataAccept-Encoding: gzip
, Anda harus melakukannya denganContent-Encoding
cara. Jika klien tidak menentukan keduanya dalam permintaannya, server tidak boleh melakukan gzip sama sekali.Penggunaan yang benar , seperti yang didefinisikan dalam RFC 2616 dan benar-benar diterapkan di alam liar, adalah agar klien mengirim
Accept-Encoding
header permintaan (klien dapat menentukan beberapa pengkodean). Kemudian server dapat, dan hanya setelah itu, menyandikan respons sesuai dengan pengkodean yang didukung klien (jika data file belum disimpan dalam pengkodean itu), menunjukkan diContent-Encoding
header tanggapan pengkodean mana yang digunakan. Klien kemudian dapat membaca data dari soket berdasarkanTransfer-Encoding
(yaitu,chunked
) dan kemudian mendekodekannya berdasarkanContent-Encoding
(yaitu:)gzip
.Jadi, dalam kasus Anda, klien akan mengirim
Accept-Encoding: gzip
header permintaan, dan kemudian server dapat memutuskan untuk mengompresi (jika belum) dan mengirim header responsContent-Encoding: gzip
dan opsionalTransfer-Encoding: chunked
.Dan ya,
Transfer-Encoding
header dapat digunakan dalam permintaan, tetapi hanya untuk HTTP 1.1, yang mengharuskan implementasi klien dan server mendukungchunked
pengkodean di kedua arah.ETag
secara unik mengidentifikasi data sumber daya di server, bukan data yang sebenarnya sedang dikirim. Jika sumber daya URL tertentu mengubahETag
nilainya, itu berarti data sisi server untuk sumber daya itu telah berubah.sumber
Content-Encoding
memerlukan yang berbedaETag
Ini adalah tentang bug mod_deflate yang saya maksud dalam jawaban saya. Membuat saya bertanya-tanya mengapa detail tingkat aplikasi ini ada dalam standar HTTP.Transfer-Encoding
Namun, saat menggunakan , pengaturan tingkat transportasi, tidak perlu mengubahETag
. Kecuali tidak ada yang menerapkan Transfer-Enc.Content-Encoding
vsTransfer-Encoding
. Ya, gzip harus menjadi properti transfer sumber daya, jika dilakukan secara on-the-fly. Di sisi lain, jika sumber daya disimpan terkompresi di server, itu harus menjadi properti konten sumber daya, jika dikirim sebagaimana adanya. Tetapi apa yang seharusnya dan apa yang sebenarnya tidak selalu sama.