Sind doppelte HTTP-Antwortheader akzeptabel?

123

Ich habe keine Spezifikation darüber gefunden, ob doppelte HTTP-Antwortheader vom Standard zugelassen werden, aber ich muss wissen, ob dies Kompatibilitätsprobleme verursacht.

Angenommen, ich habe einen Antwortheader wie diesen:

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

Beachten Sie, dass es zwei Cache-ControlHeader mit unterschiedlichen Werten gibt. Behandeln Browser sie immer so, als wären sie wie "Cache-Control: kein Cache, kein Speicher" geschrieben?

Su Zhang
quelle

Antworten:

156

Ja

HTTP RFC2616 hier verfügbar sagt:

In einer Nachricht können mehrere Nachrichten-Header-Felder mit demselben Feldnamen vorhanden sein, wenn der gesamte Feldwert für dieses Header-Feld als durch Kommas getrennte Liste definiert ist [dh # (Werte)]. Es MUSS möglich sein, die mehreren Headerfelder zu einem Paar "Feldname: Feldwert" zu kombinieren, ohne die Semantik der Nachricht zu ändern, indem jeder nachfolgende Feldwert an den ersten angehängt wird, der jeweils durch ein Komma getrennt ist. Die Reihenfolge, in der Header-Felder mit demselben Feldnamen empfangen werden, ist daher für die Interpretation des kombinierten Feldwerts von Bedeutung. Daher darf ein Proxy die Reihenfolge dieser Feldwerte beim Weiterleiten einer Nachricht NICHT ändern

Daher sind mehrere Header mit demselben Namen in Ordnung (www-authenticate ist ein solcher Fall), wenn der gesamte Feldwert als durch Kommas getrennte Werteliste definiert ist.

Die Cache-Kontrolle ist hier dokumentiert: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 wie folgt :

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

Die #1cache-directiveSyntax definiert eine Liste von mindestens einem Cache-Direktiven-Element (siehe hier für die formale Definition von #Werten: Notationskonventionen und generische Grammatik )

Also ja,

Cache-Control: no-cache, no-store

ist gleichbedeutend mit (Reihenfolge ist wichtig)

Cache-Control: no-cache
Cache-Control: no-store
Simon Mourier
quelle
2
Vielen Dank für Ihre schnelle Antwort, Simon! Aber gilt der zitierte Absatz aus RFC 2616 nicht auch für Cache-Control? Vermisse ich etwas
Su Zhang
1
Fast 100% richtig. Die Cache-Steuerung ermöglicht mehrere Werte : Cache-Control = "Cache-Control" ":" 1#cache-directive. Beachten Sie das #vorher cache-directive. Das bedeutet, dass mehrere Werte akzeptiert werden (direkt aus Ihrer obigen Definition) ...
ircmaxell
1
"genau dann, wenn der gesamte Feldwert für dieses Header-Feld als durch Kommas getrennte Liste definiert ist" - das klingt für mich so, als müssten die mehreren Werte als durch Kommas getrennte Liste definiert werden, dh sie können nicht sein als separate Überschriften aufteilen.
Mpen
2
@mark - "als durch Kommas getrennte Liste definiert" bedeutet hier "in der BNF-Grammatik als durch Kommas getrennte Liste definiert". Die Cache-Kontrollfelder sind tatsächlich so definiert (x # blahblah).
Simon Mourier
2
Der Abschnitt im neueren RFC 7230, der sich mit der Behandlung mehrerer Header befasst, ist tools.ietf.org/html/rfc7230#section-3.2.2
Matthew Buckett
0

Beachten Sie, dass der HSTS-RFC6797 dem RFC2616 widerspricht (der die Sprache "wenn und nur wenn" verletzt), indem er das Verhalten für mehrere Instanzen des STS-Headers definiert, obwohl er nicht durch durch Kommas getrennte Werte gefüllt ist:

  "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."
PosterBoy
quelle
Falsch. RFC6797 definiert den STS-Header NICHT als eine durch Kommas getrennte Liste. Die "wenn und nur wenn" -Regel aus RFC 2616 gilt also genauso (was bedeutet, dass mehrere STS-Header NICHT zulässig sind, da der STS-Header nicht als durch Kommas getrennte Liste definiert ist). RFC6797 macht es nur nicht deterministisch, welche Konsequenzen ein Verstoß gegen diese Regel hat, was RFC2616 offen zu lassen scheint.
Frans