Transfer-Encoding: gzip ve Content-Encoding: gzip


102

Yapıp yapmamak söz konusu olduğunda mevcut durum nedir

Transfer-Encoding: gzip

veya a

Content-Encoding: gzip

örneğin sınırlı bant genişliğine sahip istemcilerin sıkıştırılmış bir yanıtı kabul etme isteklerini işaret etmelerine izin vermek istediğimde ve sunucu sıkıştırıp sıkıştırmayacağına dair son söze sahip olduğunda .

İkincisi, örneğin sıkıştırmayı halletmesine izin verirseniz, Apache'nin mod_deflate ve IIS'nin yaptığı şeydir. Sıkıştırılacak içeriğin boyutuna bağlı olarak ek yapar Transfer-Encoding: chunked.

Ayrıca Vary: Accept-Encoding, soruna zaten işaret eden bir a da içerecektir . Content-Encodingvarlığın bir parçası gibi görünüyor, bu nedenle Content-Encodingtutarları varlığın bir değişikliğine değiştirmek, yani farklı bir Accept-Encodingbaşlık aracı, örneğin bir önbellek, aksi takdirde özdeş varlığın önbelleğe alınmış sürümünü kullanamaz.

Bu konuda kaçırdığım kesin bir cevap var mı (ve bu, bazı apache haber gruplarında uzun bir ileti dizisindeki bir mesajın içine gömülü değil)?

Şu anki izlenimim:

  • Aslında Transfer-Kodlama, mevcut sunucu ve istemci uygulamaları tarafından çoğunlukla İçerik Kodlama ile yapılan şeyi yapmanın doğru yolu olacaktır.
  • İçerik Kodlama, anlamsal çıkarımları nedeniyle birkaç sorun taşır (sunucu ETagbir yanıtı şeffaf bir şekilde sıkıştırdığında ne yapmalıdır ?)
  • Nedeni tavuk'n'egg: Tarayıcılar bunu desteklemiyor çünkü sunucular desteklemiyor çünkü tarayıcılar

Bu yüzden doğru yolun bir olacağını varsayıyorum Transfer-Encoding: gzip(ya da bedeni ek olarak parçalarsam, olur Transfer-Encoding: gzip, chunked ). Ve bu durumda, taşıma seviyesinde bir şey olduğu için dokunmaya Varyveya ETagbaşka herhangi bir başlığa gerek yok .

Şimdilik Transfer-Encoding, diğerlerinin her şeyden önce endişe duyduğu bir şey olan 'atlamalı atlama' konusunu çok fazla umursamıyorum , çünkü vekiller sıkıştırılmamış ve sıkıştırılmamış olarak müşteriye iletebilir. Bununla birlikte, orijinal istek uygun bir Accept-Encodingbaşlığa sahipse, proxy'ler de bunu olduğu gibi (sıkıştırılmış) iletebilir , bu da bildiğim tüm tarayıcılar için verilidir.

Btw, bu sorun en az on yıl öncesine ait, bkz. Ör. Https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .

Bununla ilgili herhangi bir açıklama memnuniyetle karşılanacaktır. Hem standartlara uygun hem de pratik olarak kabul edilenler açısından. Örneğin, yalnızca şeffaf "İçerik Kodlamasını" destekleyen HTTP istemci kitaplıkları, pratikliğe aykırı bir argüman olacaktır.



Sadece bununla karşılaştım. PHP 5.3 üzerinde Curl, Transfer-Encoding:gzipkomut satırı curl'nin anlamasına rağmen anlamaz . Güvenli tarafta olmak için, yığınları ve gzip'i birleştirmediğiniz sürece ikisini de gönderin.
Seva Alekseyev

1
@SevaAlekseyev hem gönderme derece yanlış olur - müşteriler iki kez decompress çalışabilir
Joshua Wise

Bu da beni sonsuza dek rahatsız eden bir şey ( sorduğum soru )… @ JoLiss'in aktardığı soruya verilen yanıtlardan birine göre, istek / yanıt gövdelerini sıkıştırmanın mükemmel mantıklı, anlamsal olarak tutarlı ve standartlara uygun bir yolu var… ve temelde hiçbir istemci / sunucu bunu kullanmaz veya desteklemez. 🤦🏻‍
Dan Lenski

Yanıtlar:


35

RFC 2616'nın yazarlarından Roy T. Fielding'den alıntı :

içerik kodlamasını anında tutarsız bir şekilde değiştirmek (ne "hiçbir zaman" ne de "her zaman), bu içerikle ilgili daha sonraki taleplerin (örneğin, PUT veya koşullu GET) doğru şekilde işlenmesini imkansız kılar. Elbette, performansın nedeni budur. anında içerik kodlama aptalca bir fikir ve kaynağı değiştirmeden anında kodlamayı yapmanın doğru yolu olarak HTTP'ye neden Transfer-Encoding'i ekledim.

Kaynak: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31

Başka bir deyişle: Anında İçerik Kodlama yapmayın , bunun yerine Transfer Kodlamasını kullanın!

Düzenleme: Yani, yalnızca İçerik Kodlamayı anlayan istemcilere gzip'lenmiş içerik sunmak istemediğiniz sürece . Maalesef çoğu öyle görünüyor. Ancak , spesifikasyon alanlarını terk ettiğinizi ve Fielding'in bahsettiği gibi diğer sorunların yanı sıra, örneğin önbelleğe alma proxy'leri söz konusu olduğunda, sorunlarla karşılaşabileceğinizi unutmayın.


3
Yani doğru anlarsam: 1. İçerik kodlama, özette sunucu üzerindeki içerik kodlamasına atıfta bulunur, yani içerik sürekli olarak sunucu tarafından belirtilen kodlamayla sunulacaktır. 2. Transfer kodlaması, sunucunun bu durumda, yani bu yanıtta kullanıcı aracısına teslim etmek için kullanmaya karar verdiği kodlamayı ifade eder. Cevabınızı yanlış yorumlamadığımdan emin olmak için.
nokta eğik çizgi hack

31
@KemHeyndels Hakkı hakkında. Başka bir deyişle: Spesifikasyonlara göre, Transfer-Encoding saf bir aktarım katmanı ayrıntısıdır , yani bir ara proxy, bu seviyede gzip sıkıştırmasını geri almakta serbesttir, oysa Content-Encoding bir proxy'nin olmayacağı bir iş katmanı özelliğidir . diğer sonuçlara ek olarak (ETag'ler vb.) değişmesine izin verilir. Ancak gerçeğe göre , TE normalde sıkıştırma için kullanılmaz ve birçok sunucu / istemci onu kutudan çıkardığı gibi desteklemez, oysa CE az çok TE'nin kullanılmasının amaçlandığı şekilde kullanılır : bir taşıma katmanı ayrıntısı olarak .
Evgeniy Berezovsky

1
Yani gerçekte Roy T. Fielding'in tavsiyesini görmezden gelmek zorunda mıyız?
nokta eğik çizgi hack

11
@KemHeyndels İdealizm nedeniyle dışarı çıkıp önce tüm açık kaynaklı HTTP istemci / sunucu uygulamalarına TE desteği eklemeye mecbursunuz. Ardından, kapalı kaynak HTTP uygulamaları olan her şirkette işe alın (sanırım bu yalnızca Microsoft) ve özelliği oraya da ekleyin. Bundan sonra gerçeklik ve özellik çakışacak. ;) (Ve HTTP 2.0 yayımlanacak ve sorunu yine de ortadan kaldıracak)
Evgeniy Berezovsky

10
Transfer-Encoding'i desteklediğinizi belirtmek, hala Transfer-Encoding üzerinden gzip'i desteklediğinizi netleştirmez, bu yüzden bu size hiçbir şey kazandırmaz. Gösterge tam tersi şekilde yapılır : Transfer-Encoding aracılığıyla gzip yapabilen herhangi bir istemci ayarlayarak sunucuyu bilgilendirecektir TE: gzip. Ve sonra sunucunuz Transfer-Encoding yoluna gitmelidir. Müşteri sadece diyorsa Accept-Encoding: gzip, bunu bu Content-Encodingşekilde yapmalısın . İstemci isteğinde hiçbirini belirtmiyorsa, sunucu hiç gzip yapmamalıdır.
Evgeniy Berezovsky

28

Doğru kullanım olarak RFC 2616 yılında tanımlanmış ve aslında vahşi hayata, bir gönderme istemci içindir Accept-Encodingisteği başlığını (istemci birden kodlamalar belirtebilirsiniz olabilir). Sunucu daha sonra ve ancak o zaman, yanıtı müşterinin desteklenen kodlamalarına göre kodlayabilir (dosya verileri o kodlamada zaten depolanmamışsa), Content-Encodingyanıt başlığında hangi kodlamanın kullanıldığını belirtebilir . İstemci daha sonra göre yuvanın kapalı verileri okuyabilir Transfer-Encoding(yani, chunked) ve daha sonra göre kodunu çözmek Content-Encoding(yani gzip).

Bu nedenle, sizin durumunuzda, istemci bir Accept-Encoding: gzipistek başlığı gönderir ve ardından sunucu sıkıştırmaya (henüz değilse) ve bir Content-Encoding: gzipve isteğe bağlı olarak Transfer-Encoding: chunkedyanıt başlığı göndermeye karar verebilir .

Ve evet, Transfer-Encodingbaşlık isteklerde kullanılabilir, ancak yalnızca hem istemci hem de sunucu uygulamalarının chunkedkodlamayı her iki yönde de desteklemesini gerektiren HTTP 1.1 için kullanılabilir .

ETagGerçekte aktarılan verileri değil, sunucudaki kaynak verilerini benzersiz şekilde tanımlar. Belirli bir URL kaynağının ETagdeğerini değiştirmesi, o kaynağın sunucu tarafı verilerinin değiştiği anlamına gelir.


14
içerik-kodlama, İstek-URI tarafından tanımlanan varlığın bir özelliğidir. Başka bir deyişle: Farklı Content-Encoding, farklı gerektirirETag Bu, cevabımda bahsettiğim mod_deflate hatası tamamen bununla ilgili. Bu uygulama düzeyinde detayın neden ilk etapta HTTP standardında olduğunu merak etmeme neden oluyor. Transfer-EncodingBununla birlikte, bir taşıma seviyesi ayarını kullanırken ETag,. Ancak hiç kimse Transfer-Enc uygulamamıştır.
Evgeniy Berezovsky

2
İçerik Kodlama, "anında" kodlama için değildir. RFC 2616, "Aktarım Kodlaması ..., içerik kodlamasından farklıdır, çünkü aktarım kodlaması varlığın değil, iletinin bir özelliğidir." ( Tools.ietf.org/html/rfc2616#section-14.41 ) ve "İçerik kodlaması, İstek-URI'si tarafından tanımlanan varlığın bir özelliğidir. Tipik olarak, varlık gövdesi bu kodlamayla saklanır" ( tools.ietf.org/html/rfc2616#section-14.11 ). Ben de oy veriyorum.
Robert

Ne açıklanan "budur aslında vahşi hayata olursa olsun," Content-Encodingvs Transfer-Encoding. Evet, anında yapılırsa gzip , bir kaynak aktarımının özelliği olmalıdır . Öte yandan, eğer kaynak sunucuda sıkıştırılmış şekilde depolanırsa, olduğu gibi gönderiliyorsa bunun yerine kaynağın içeriğinin bir özelliği olmalıdır . Ama olması gereken ve gerçekte olan her zaman aynı şey değildir.
Remy Lebeau
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.