2010-01-21 17 views
41

Aşağıdaki HTTP 1.1 başlığı ne anlama geliyor? If-None-MatchHTTP başlığı If-None-Match: * ne anlama geliyor?

: *

güçlü veya zayıf ETag veya ETAGlar hatta bir listesini kullanırken Anladığım, ama faydası understant yok yıldızı kullanırken (*) .

Düzeltme: "If-None-Match: *" seçeneğine nasıl cevap verileceğini gösteren bazı pseudocode'lara (PHP kodu da iyi) sahip olmak güzel olurdu.

cevap

36

cevap: duruma göre değişir.

varsayalım biz

If-None-Match: * 
If-Modified-Since: <yesterday date> 

aldık Ve sayfa bugün değiştirildi.

Öncelikle bize * bakmak: "kaynak yok ve koşul (2) yerine ise 304 Dönüş". İyi, kaynak var, AMA koşulu (2) durumu: "Tarih, akımdan daha geç ise, yalnızca 304 döndür". Yani bu koşul karşılanmadı ve sayfa tamamen teslim edilecek. (Hayır If-None-Match yokmuş gibi) kaynak talep üzerine olmasaydı

biz If-Modified-Since almamış olsaydı, tepki

304. olurdu, biz uygun kodu döndü olurdu.

304 yalnızca GET ve HEAD isteklerine yanıt olarak iade edilmeli ve tüm önbellekle ilgili yanıt üstbilgilerinin orada olması gerekir. Diğer tüm talep türleri için sunucunuzun 412 yanıt vermesi gerekiyor (Önkoşul başarısız oldu). Ben yardımcı olur umarım

;)

+0

Eğer If-None-Match'de * varsa, 304'ü düzeltmenin tek yolu If-Modified-Since seçilip eşleşiyor mu? – AlexV

+1

Ya, ya da 'If-Modified-Since' hiç. Yani 2 yol var. –

10

RFC 2616 (HTTP 1.1) alıntı: "*" verildi ve herhangi mevcut taraf bu kaynak için var olup olmadığını böylece kaynak en yüzünden gerekmediği takdirde

..., sunucu, istenen yöntemini gerçekleştirmek ZORUNLU Değişiklik tarihi, istekte bir If-Modified-Since başlık alanında sağlanan ile eşleşmiyor.

RFC yerine isteği gerçekleştirme, sunucular GET ve BAŞ istekleri için 304 (değiştirilmemiş) ile yanıtlaması gerektiğini ve hepsi diğer istek türleri için (önkoşul başarısız) 412 ile yanıtlaması gerektiğini söylemeye devam ediyor . Ancak bu sadece sunucuda istenen kaynağın bazı sürümleri varsa. Eğer herhangi bir varlıkları yoksa (herhangi bir şey olmadığı için muhtemelen 404 ile), o zaman isteği işlemek gerekir.

Bir isteği işlemek için önce, sunucunun başlığı bulunmuyorsa sunucunun ne yapacağını öğrenin. Bu isteğin sonucu değil 2xx veya 304 ise, isteği normal olarak sunun. Ancak, isteğinin sonucu,, 2xx veya 304 olur, If-None-Modified durumda. Bir yıldız olduğunda, o zaman hemen 304'ü (eğer If-Modified-Since tarafından ezilmediği sürece) döndürün. Bir veya daha fazla varlık etiketi varsa, bu etiketlerden herhangi birinin yanıt olarak sunmayı planladığınız şeyin etiketiyle eşleşip eşleşmediğini kontrol edin. Herhangi bir eşleşme varsa, 304; Eşleşme yoksa, normalde yapacağınız gibi servis yapın. Daha sonra RFC

, dahası var:

"If-None-Match: *" anlamı temsil kökeni sunucusu tarafından seçilen eğer yöntem uygulanmalıdır ZORUNLU olduğu (a veya Önbellek, Muhtemelen Vary mekanizmasını kullanarak, bkz. bölüm 14.44) var ve temsil yoksa, yapılmalıdır. Bu özellik PUT işlemleri arasındaki ırkların önlenmesinde yararlı olması amaçlanmıştır. olduğu

, yıldız müşteri demek verir "zaten orada bu dosyanın herhangi sürümü varsa bu dosyayı PUT etmeyin."

+3

Ve bu düz İngilizce anlamı nedir? Eğer * verilirse, normal olarak (304 olmadan) sayfaya hizmet verir miyim? If-Modified-Since sağlanmış olsa bile ... – AlexV