Bei HTTP-Headern wird zwischen Groß- und Kleinschreibung unterschieden?

713

In einem Blog-Beitrag verwende ich das folgende PHP, um den Inhaltstyp einer Antwort festzulegen:

header('content-type: application/json; charset=utf-8');

Ich habe gerade einen Kommentar zu diesem Beitrag erhalten, der besagt, dass content-typegroß geschrieben werden muss Content-type. Ist das richtig? Es scheint für mich mit allen Kleinbuchstaben zu funktionieren, und ich nahm an, dass bei den HTTP-Headern die Groß- und Kleinschreibung nicht berücksichtigt wurde. Oder funktioniert es nur, weil Browser nett sind?

Svish
quelle
26
Die Groß- und Kleinschreibung wird nicht berücksichtigt, aber wenn Sie den Fall beheben möchten, sollte es sich um "Inhaltstyp" handeln.
mc0e
10
FWIW, das Senden von "Zeichensatz" mit application / json ist sinnlos. Es gibt keinen solchen Parameter.
Julian Reschke
5
@JulianReschke - Das ist falsch, Zeichensatz ist ein gültiger Parameter im Content-Type-Header. Siehe w3.org/International/articles/http-charset/index und developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain
8
@NullUserException - Der Nachteil (abgesehen von verschwendeten Bytes) besteht darin, die Leute weiterhin über den Zeichensatzparameter zu verwirren. Lassen Sie stattdessen einfach diese Komponenten reparieren.
Julian Reschke
10
@ JulianReschke ist richtig. Die IANA-Anwendung / JSON-Zuweisung besagt, dass der Zeichensatz für diesen Medientyp bedeutungslos ist. es macht nichts. Bitte fügen Sie es nicht hinzu, da es Lärm ist, der zu unnötiger Verwirrung führt.
Stellen Sie Monica 2331977

Antworten:

934

Bei Headernamen wird nicht zwischen Groß- und Kleinschreibung unterschieden.

Aus RFC 2616 - "Hypertext Transfer Protocol - HTTP / 1.1" , Abschnitt 4.2, "Nachrichtenkopfzeilen" :

Jedes Header-Feld besteht aus einem Namen, gefolgt von einem Doppelpunkt (":") und dem Feldwert. Bei Feldnamen wird zwischen Groß- und Kleinschreibung unterschieden.

Der aktualisierte RFC 7230 listet an dieser Stelle keine Änderungen gegenüber RFC 2616 auf.

Ignacio Vazquez-Abrams
quelle
96
Die Antwort ist immer noch richtig. In RFC 7230 heißt es: "Jedes Header-Feld besteht aus einem Feldnamen ohne Berücksichtigung der Groß- und Kleinschreibung, gefolgt von einem Doppelpunkt (": "), einem optionalen führenden Leerzeichen, dem Feldwert und einem optionalen nachfolgenden Leerzeichen."
Martin Müller
6
Bei Header-Feldern wird zwischen Groß- und Kleinschreibung unterschieden, wenn PHP verwendet wird, um den Wert eines Header-Felds mithilfe der Methode 'apache_request_headers ()' abzurufen.
Harm
7
Kann jemand Beispiele für gängige Browser nennen, die diesbezüglich nicht den Spezifikationen entsprechen?
David W
7
@Harm Das liegt nur daran, dass beim Vergleich von Zeichenfolgen in PHP zwischen Groß- und Kleinschreibung unterschieden wird.
MrWhite
7
Für alle, die suchen, gibt RFC 7230 hier ausdrücklich an, dass Feldheader ohne Berücksichtigung der
JZ
238

HTTP-Headernamen unterscheiden gemäß RFC 2616 nicht zwischen Groß- und Kleinschreibung :

4.2:

Jedes Header-Feld besteht aus einem Namen, gefolgt von einem Doppelpunkt (":") und dem Feldwert. Bei Feldnamen wird die Groß- und Kleinschreibung nicht berücksichtigt.

(Bei Feldwerten kann zwischen Groß- und Kleinschreibung unterschieden werden oder nicht.)

Wenn Sie darauf vertrauen, dass die wichtigsten Browser dies einhalten, sind Sie bereit.


BTW, anders als die meisten HTTP, Methoden (Verben) sind Groß- und Kleinschreibung:

5.1.1 Methode

Das Methodentoken gibt die Methode an, die für die
durch den Anforderungs-URI angegebene Ressource ausgeführt werden soll. Bei der Methode wird zwischen Groß- und Kleinschreibung unterschieden.

   Method         = "OPTIONS"                ; Section 9.2
                  | "GET"                    ; Section 9.3
                  | "HEAD"                   ; Section 9.4
                  | "POST"                   ; Section 9.5
                  | "PUT"                    ; Section 9.6
                  | "DELETE"                 ; Section 9.7
                  | "TRACE"                  ; Section 9.8
                  | "CONNECT"                ; Section 9.9
                  | extension-method
   extension-method = token
Leichtigkeitsrennen im Orbit
quelle
Ein anderer Kommentar sagte, diese Antwort sei veraltet. Ist das wahr? Wenn ja, können Sie es vielleicht aktualisieren, damit die Leute nicht verwirrt werden.
Speedplane
36

tldr; Bei HTTP / 1.1- und HTTP / 2-Headern wird die Groß- und Kleinschreibung nicht berücksichtigt.

Gemäß RFC 7230 (HTTP / 1.1):

Jedes Header-Feld besteht aus einem Feldnamen ohne Berücksichtigung der Groß- und Kleinschreibung, gefolgt von einem Doppelpunkt (":"), einem optionalen führenden Leerzeichen, dem Feldwert und einem optionalen nachfolgenden Leerzeichen.

https://tools.ietf.org/html/rfc7230#section-3.2

Auch RFC 7540 (HTTP / 2):

Genau wie in HTTP / 1.x sind Headerfeldnamen Zeichenfolgen von ASCII-
Zeichen, die ohne Berücksichtigung der Groß- und Kleinschreibung verglichen werden.

https://tools.ietf.org/html/rfc7540#section-8.1.2

Afshin Mehrabani
quelle
19
nur zu klären: Feldnamen sind Groß- und Kleinschreibung; Bei Feldwerten kann je nach Feldname zwischen Groß- und Kleinschreibung unterschieden werden.
Julian Reschke
7
Fortsetzung des Zitierens aus HTTP / 2-RFC: "Header-Feldnamen MÜSSEN jedoch vor ihrer Codierung in HTTP / 2 in Kleinbuchstaben konvertiert werden. Eine Anforderung oder Antwort, die Header-Feldnamen in Großbuchstaben enthält, MUSS als fehlerhaft behandelt werden (Abschnitt 8.1.2.6)"
Borek Bernard
2
Ich habe gerade bemerkt, dass der Teil "MUSS in Kleinbuchstaben umgewandelt werden ..." ebenfalls vorhanden ist. Warum ist das so? CamelCase scheint in der Praxis ein bevorzugtes Gehäuse zu sein (Entwicklertools, beliebte Codebibliotheken). Warum sollte HTTP / 2 also versuchen, diesem Trend zu widersprechen?
Jimim
7
@jimp - weil es bei Standards um Konsistenz geht - kann die Verwendung von Kamelkästchen mehrdeutig sein - insbesondere bei Abkürzungen, Initialisierungen und Akronymen. Beispiel: "Front-End-HTTP" oder "Front-End-HTTPS" - "WWW-Authentifizierung" oder "Www-Authentifizierung" - Wenn Sie alle Kleinbuchstaben angeben, werden Mehrdeutigkeiten durch Standardisierung des Felds beseitigt. Dies vereinfacht wiederum die Handhabung der Header rundum.
Fraser
16

header('Content-type: image/png') funktionierte nicht mit PHP 5.5 für IE11, da im Bildstrom als Text angezeigt wurde

header('Content-Type: image/png') gearbeitet, wie im Bild als Bild erschien

Der einzige Unterschied ist das Kapital 'T'.

Rüdiger W.
quelle
18
Dann gibt es offensichtlich ein Problem mit der Implementierung, da alle Header-Felder ohne Berücksichtigung der Groß- und Kleinschreibung gelesen werden sollen. Apache Bench ist auch durcheinander. Es mag keine Feldnamen in Kleinbuchstaben.
Bond
8

Sie unterscheiden nicht zwischen Groß- und Kleinschreibung. Tatsächlich konvertiert der NodeJS-Webserver sie explizit in Kleinbuchstaben, bevor sie im Anforderungsobjekt verfügbar gemacht werden.

Hierbei ist zu beachten, dass alle Header nur in Kleinbuchstaben dargestellt werden, unabhängig davon, wie der Client sie tatsächlich gesendet hat. Dies vereinfacht das Parsen von Headern für jeden Zweck.

Jayarjo
quelle
Dies liegt daran, dass bei Node / Javascript zwischen Groß- und Kleinschreibung unterschieden wird. Um die Dinge zu vereinfachen, normalisieren sie alles auf Kleinbuchstaben, was bedeutet, dass bei den HTTP-Headern die Groß- und Kleinschreibung nicht berücksichtigt wird.
Svish
4

Der RFC für HTTP (wie oben zitiert) schreibt vor, dass bei den Headern die Groß- und Kleinschreibung nicht berücksichtigt wird. Bei bestimmten Browsern (ich sehe Sie an, IE) ist es jedoch am besten, jedes der Wörter groß zu schreiben:

Location: http://stackoverflow.com

Content-Type: text/plain

vs.

location: http://stackoverflow.com

content-type: text/plain

Dies ist kein "HTTP" -Standard, sondern nur eine weitere Besonderheit des Browsers, über die wir als Entwickler nachdenken müssen.

Robert Lerner
quelle
3
Könnten Sie hierfür Beweise vorlegen?
Julian Reschke
3
Ich meinte einen konkreten Testfall; Ich habe einen IE zum Testen.
Julian Reschke
11
Warum genau ist es am besten?
Svish
Ich werde einen Browser erstellen, der Header mit zufälliger Großschreibung sendet, nur um mit Entwicklern zu schrauben
GideonMax
0

Offiziell wird bei Überschriften die Groß- und Kleinschreibung nicht berücksichtigt. Es ist jedoch üblich, den ersten Buchstaben jedes Wortes in Großbuchstaben zu schreiben.
Da dies jedoch gängige Praxis ist, gehen bestimmte Programme wie IE davon aus, dass die Header groß geschrieben werden.
Während die Dokumente sagen, dass die Groß- und Kleinschreibung nicht berücksichtigt wird, haben schlechte Programmierer die Dokumente grundsätzlich geändert.

GideonMax
quelle
-4

Das Header-Wort unterscheidet nicht zwischen Groß- und Kleinschreibung, aber rechts wie der Inhaltstyp empfiehlt es sich, es so zu schreiben, da es zwischen Groß- und Kleinschreibung unterscheidet. wie mein Beispiel unten

headers = headers.set('Content-Type'
PPK
quelle