"Vary: Accept" HTTP başlığının işlevi nedir?


93

Dinamik Web sayfaları oluşturmak için PHP kullanıyorum. Aşağıdaki eğitimde belirtildiği gibi (aşağıdaki bağlantıya bakın), $ _SERVER ['HTTP_ACCEPT'] izin verdiğinde XHTML belgelerinin MIME türü "application / xhtml + xml" olmalıdır. Aynı sayfayı 2 farklı MIME ("application / xhtml + xml" ve "text / html") ile sunabileceğiniz için "Vary" HTTP başlığını "Kabul Et" olarak ayarlamalısınız. Bu, proxy'lerdeki önbelleğe yardımcı olacaktır.

Bağlantı: http://keystonewebsites.com/articles/mime_type.php

Şimdi şu ifadenin ne anlama geldiğinden emin değilim: header ('Vary: Accept'); "Vary: Kabul Et" in tam olarak ne yapacağından emin değilim ...

Bulduğum tek açıklama:

Content-Type başlığından sonra bir Vary başlığı gönderilir (eğer doğru anlarsam) ara önbelleklere, proxy sunucuları gibi, belgenin içerik türünün belgeyi isteyen istemcinin yeteneklerine bağlı olarak değiştiğini söyler. http://www.456bereastreet.com/archive/200408/content_negotiation/

Herkes bana bu başlığın "gerçek" bir açıklamasını verebilir ( bu değerle ). Sanırım şu gibi şeyleri anlıyorum: Değişken: Proxy'lerdeki önbelleğin sunulan sayfanın kodlamasına dayalı olabileceği Accept-Encoding, ancak anlamıyorum: Vary: Kabul et


1
Açıkçası - zahmet etme. Bu sitedeki uygulamadaki kusurları bir kenara bırakırsak, bir XML içerik türü ile hizmet vermekten yararlanacağınız tek zaman, text / html'de yapılamayan şeyleri yaptığınız zamandır - ve eğer tüm yapıyorsanız Doctype ve xmlns'yi değiştiriyor, o zaman bu şeyleri yapmayacaksınız. Metin / html'ye bağlı kalın. Bu konuda, HTML 4.01'e bağlı kalmanız da iyi olur.
Quentin

Evet bunu anlıyorum ve bunun gibi "problemlerin" Web geliştirmede çok sık ortaya çıktığını düşünüyorum. Özelliklerdeki / RFC'lerdeki "gerekir" sayesinde!
AlexV

2
VARY'yi kullanmayı düşünmeden önce muhtemelen şunu okumalısınız: blogs.msdn.com/ieinternals/archive/2009/06/17/… .
EricLaw

1
Bu videodaVary: başlık hakkında iyi bir açıklama var .
Kannan Mohan

Yanıtlar:


94
  • cache-controlBaşlık bir önbellek proxy bir yanıtın "tazelik" anlatmak için bir HTTP sunucusu için birincil mekanizmadır. (yani, yanıtın önbellekte nasıl / ne kadar süreyle saklanacağı)

  • Bazı durumlarda cache-controldirektifler yetersizdir. Burada, yalnızca dil ile değişen bir sayfayı açıklayan HTTP çalışma grubundan bir tartışma arşivlenmiştir . Bu, değişken başlığı için doğru kullanım durumu değildir , ancak bağlam, tartışmamız için değerlidir. (Bu durumda Vary başlığının sorunu çözeceğine inanmama rağmen, Daha İyi bir Yol var.) O sayfadan:

Vary kesinlikle bir proxy'nin sunucunun yapacağını çoğaltmasının umutsuz veya aşırı derecede karmaşık olduğu durumlar içindir.

Yapmacık bir örnek:

HTTP sunucunuzun büyük bir açılış sayfası var. Kullanıcının daha önce orada bulunup bulunmadığına bağlı olarak, aynı URL'ye sahip biraz farklı iki sayfanız var. Çerezlere dayalı olarak istekleri ve bir kullanıcının "ziyaret sayısını" ayırt edersiniz. Ancak - sunucunuzun açılış sayfası çok büyük olduğu için, aracı proxy'lerin mümkünse yanıtı önbelleğe almasını istersiniz.

URL, Last-Modified ve Cache-Control üstbilgileri, bu bilgiyi bir önbelleğe alma proxy'sine vermek için yetersizdir, ancak eklerseniz Vary: Cookie, önbellek motoru, önbelleğe alma kararlarına Çerez başlığını ekleyecektir.

Son olarak, küçük trafik için dinamik web siteleri - her zaman basit Cache-Control: no-cache, no-storeve Pragma: no-cacheyeterli buldum .

Düzenle - sorunuzu daha kesin bir şekilde yanıtlamak için: HTTP istek başlığı 'Kabul Et', bir müşterinin işleyebileceği İçerik Türlerini tanımlar. Aynı URL'de aynı içeriğin yalnızca İçerik Türü bakımından farklılık gösteren iki kopyasına sahipseniz, kullanmak Vary: Acceptuygun olabilir.

Güncelleme 11 Eylül 12:

Bu yorumun orijinal olarak gönderilmesinden bu yana yorumlarda görünen birkaç bağlantı ekliyorum. Her ikisi de gerçek dünya örnekleri (ve sorunları) için Vary: Kabul Et; Eğer bu cevabı okuyorsanız, o linkleri de okumalısınız.

Birincisi, olağanüstü EricLaw'dan, Internet Explorer'ın Vary başlığıyla davranışına ve geliştiricilere sunduğu bazı zorluklardan: Vary Header, IE'de Önbelleğe Almayı Önler . Kısacası, IE (IE9 öncesi), istek önbelleği HTTP İstek başlıklarını içermediğinden, Vary başlığını kullanan herhangi bir içeriği önbelleğe almaz. EricLaw (gerçek dünyada Eric Lawrence), IE ekibinde bir Program Yöneticisidir.

İkincisi, Eran Medan'dan ve Chrome'da Vary ile ilgili beklenmedik davranışların devam eden bir tartışması: Destek, Vary başlığını doğru şekilde işlemez . Bu, IE'nin davranışıyla ilgilidir, ancak Chrome geliştiricileri farklı bir yaklaşım benimsemiştir - kasıtlı bir seçim gibi görünmese de.


3
Chrome'daki geri tarayıcı düğmesiyle bağlantılı olarak buna dikkat edin, bu hatayla ilgili bir tür alev savaşı var (bu, bir nedenle artık düzeltilemiyor) code.google.com/p/chromium/issues/detail?id=94369
Eran Medan

6
@EranMedan Chrome hatası o zamandan beri düzeltildi.

59

Vary: Acceptbasitçe yanıtın Acceptistekteki başlığa göre oluşturulduğunu söylüyor . Farklı bir Acceptbaşlığa sahip bir istek, farklı bir yanıt alabilir.

(Bağlantılı PHP kodunun baktığını görebilirsiniz $HTTP_ACCEPT. Bu, Acceptistek başlığının değeridir .)

HTTP önbellekleri için bu, yanıtın ekstra özenle önbelleğe alınması gerektiği anlamına gelir. Yalnızca tam olarak aynı Acceptbaşlığa sahip sonraki istekler için geçerli bir eşleşme olacaktır .

Şimdi bu yalnızca sayfa ilk etapta önbelleğe alınabilirse önemlidir. Varsayılan olarak PHP sayfaları değildir. Bir PHP sayfası, belirli başlıkları göndererek ( Expiresörneğin) çıktıyı önbelleğe alınabilir olarak işaretleyebilir . Ancak bunun yapılıp yapılmaması ve nasıl yapılacağı farklı bir sorudur.


"alabilir" mi yoksa "almalı" mı?
Pacerier

6
@Pacerier "alabilir" doğru. Vary: Accepther bir olası farklı Acceptbaşlık değerinin farklı ve benzersiz bir yanıt ürettiği anlamına gelmez . Sadece farklı bir anlamı Acceptbaşlık olabilir Farklı bir yanıt üretir.
Jason Orendorff


2

Aslında çok yakında (ve zaten Chrome'da), Varybaşlığı son derece kullanışlı kılan önemli sayıda yeni özellik var . Örneğin, İstemci İpucunu ele alalım . Görüntülerle bağlantılı olarak kullanıldığında, örneğin, istemci ipuçları, bir sunucunun aşağıdakilere bağlı olarak görüntüler gibi kaynakları optimize etmesine olanak tanır:

  • Resim Genişliği
  • Görüntü Alanı Genişliği
  • Tarayıcı tarafından desteklenen kodlama türü (WebP'yi düşünün)
  • Downlink (esasen ağ hızı)

Dolayısıyla, bu özellikleri destekleyen bir sunucu, Varybaşlığı bunu belirtecek şekilde ayarlayacaktır .

Chrome, "resim / webp" yi Vary , her istek başlığın bir . Dolayısıyla, tarayıcı destekliyorsa bir sunucu bir görüntüyü WebP olarak yeniden yazabilir, bu nedenle proxy'nin bir WebP görüntüsünü önbelleğe almaması için başlığı kontrol etmesi ve ardından WebP'yi desteklemeyen bir tarayıcıya sunması gerekir. Açıkçası, eğer sunucunuz bunu yapmazsa, fark etmez. Dolayısıyla, sunucunun yanıtı Acceptistek başlığına göre değiştiğinden, proxy'leri karıştırmamak için yanıt şunu içermelidir:

Vary: Accept

Başka bir örnek, görüntü genişliği olabilir. Bir mobil tarayıcıda, Widthbir masaüstü tarayıcısından görüntülendiğinde ne olacağı ile karşılaştırıldığında, duyarlı bir görüntü için başlık oldukça küçük olabilir. Yani bu durumda Width,Vary proxy'nin küçük mobil sürümü önbelleğe almaması ve masaüstü tarayıcılara sunmaması veya tam tersi başlığa . Bu durumda başlık şunları içerebilir:

Vary: Accept, Width

Veya bir sunucunun tüm istemci ipucu özelliklerini desteklemesi durumunda, başlık şu şekilde olacaktır:

Vary: Accept, DPR, Width, Save-Data, Downlink
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.