Yinelenen HTTP Yanıt Başlıkları kabul edilebilir mi?


123

Yinelenen HTTP yanıt başlıklarına standart tarafından izin verilip verilmediğine dair herhangi bir özellik bulamadım, ancak bunun uyumluluk sorunlarına neden olup olmayacağını bilmem gerekiyor.

Şöyle bir yanıt başlığım olduğunu varsayalım:

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5
Cache-Control: no-cache
Cache-Control: no-store
Location: http://localhost:9876/foo.bar
Content-Language: en-US
Content-Length: 0
Date: Mon, 06 Dec 2010 21:18:26 GMT

Cache-ControlFarklı değerlere sahip iki başlık olduğuna dikkat edin . Tarayıcılar onlara her zaman "Önbellek Kontrolü: önbellek yok, depolamasız" gibi yazılmış gibi mi davranır?

Yanıtlar:


157

Evet

Burada bulunan HTTP RFC2616 şunu söylüyor:

Aynı alan adına sahip birden çok mesaj başlığı alanı, ancak ve ancak bu başlık alanı için alan değerinin tamamı virgülle ayrılmış bir liste olarak tanımlanmışsa [yani, # (değerler)] bir mesajda mevcut OLABİLİR. Birden fazla başlık alanını, mesajın anlamını değiştirmeden tek bir "alan-adı: alan-değeri" çifti halinde birleştirmek, her bir sonraki alan değerini birinciye, her biri virgülle ayrılmış bir şekilde eklemek ZORUNLU OLMALIDIR. Aynı alan adına sahip başlık alanlarının alındığı sıra, bu nedenle, birleşik alan değerinin yorumlanması için önemlidir ve bu nedenle, bir vekil bir mesaj iletildiğinde bu alan değerlerinin sırasını DEĞİŞTİRMEMELİDİR

Dolayısıyla, alan değerinin tamamı virgülle ayrılmış değerler listesi olarak tanımlanırsa, aynı ada sahip birden çok başlık uygundur (www-kimlik doğrulaması böyle bir durumdur).

Önbellek kontrolü burada belgelenmiştir: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 şunun gibi:

Cache-Control   = "Cache-Control" ":" 1#cache-directive

#1cache-directiveSözdizimi en az bir önbellek yönergesi öğelerin listesini (#values resmi tanımı için bkz: tanımlayan simge özellikleri ve Genel Dilbilgisi )

Yani evet,

Cache-Control: no-cache, no-store

eşdeğerdir (sıra önemlidir)

Cache-Control: no-cache
Cache-Control: no-store

2
Hızlı cevabın için teşekkürler Simon! Ancak RFC 2616'dan alıntılanan paragraf Önbellek Kontrolü için de geçerli değil mi? Bir şey mi kaçırıyorum?
Su Zhang

1
Neredeyse% 100 doğru. Önbellek Kontrolü birden çok değer için izin verir: Cache-Control = "Cache-Control" ":" 1#cache-directive. Dikkat #önce cache-directive. Bu, birden fazla değerin kabul edildiğini gösterir (yukarıdaki tanımınızdan itibaren) ...
ircmaxell

1
"ancak ve ancak o başlık alanı için alan değerinin tamamı virgülle ayrılmış bir liste olarak tanımlanırsa" - bu bana birden çok değerin virgülle ayrılmış liste olarak tanımlanması gerektiği gibi geliyor , yani olamazlar ayrı başlıklar olarak bölün.
mpen

2
@mark - "virgülle ayrılmış liste olarak tanımlanır" burada "BNF dilbilgisinde virgülle ayrılmış liste olarak tanımlanan" anlamına gelir. Önbellek kontrol alanları aslında bu şekilde tanımlanır (x # blahblah).
Simon Mourier

2
Daha yeni RFC 7230'da
Matthew

0

HSTS RFC6797'nin, virgülle ayrılmış değerlerle doldurulmamasına rağmen, STS başlığının birden çok örneği için davranışı tanımlayarak RFC2616 ile çeliştiğini ("eğer ve yalnızca eğer" dilini ihlal eder) unutmayın:

  "If a UA receives more than one STS header field in an HTTP
  response message over secure transport, then the UA MUST process
  only the first such header field."

Yanlış. RFC6797, STS başlığını virgülle ayrılmış bir liste içerecek şekilde TANIMLAMAZ. Bu nedenle, RFC 2616'daki "eğer ve yalnızca eğer" kuralı aynı şekilde uygulanır (yani, STS başlığı virgülle ayrılmış bir liste alıyor olarak tanımlanmadığından birden fazla STS başlığına izin VERİLMEMEKTEDİR). RFC6797, bu kuralı ihlal etmenin sonuçlarının ne olacağını belirleyici olmayan bir hale getiriyor, RFC2616'nın açık bıraktığı bir şey.
Frans
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.