Заголовки HTTP чувствительны к регистру? - PullRequest
597 голосов
/ 10 марта 2011

В сообщении в блоге я использую следующий PHP, чтобы установить тип содержимого ответа:

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

Я только что получил комментарий к этому сообщению, в котором говорится, что content-type нужно использовать с заглавной буквы, Content-type. Это правильно? Кажется, он работает со всеми строчными буквами, и я предположил, что заголовки HTTP не чувствительны к регистру. Или это просто работает, потому что браузеры хороши?

Ответы [ 6 ]

801 голосов
/ 10 марта 2011

Имена заголовков не чувствительны к регистру.

С RFC 2616 - «Протокол передачи гипертекста - HTTP / 1.1» , Раздел 4.2, «Заголовки сообщений» :

Каждое поле заголовка состоит из имени, за которым следуют двоеточие (":") и значение поля. Имена полей чувствительны к регистру в .

Обновление RFC 7230 не содержит никаких изменений по сравнению с RFC 2616 в этой части.

215 голосов
/ 10 марта 2011

Имена заголовков HTTP не чувствительны к регистру, в соответствии с RFC 2616 :

4,2

Каждое поле заголовка состоит из имени, за которым следуют двоеточие (":") и значение поля. Имена полей не чувствительны к регистру.

(Поле значения могут быть или не быть чувствительными к регистру.)

Если вы доверяете этим основным браузерам, все готово.


Кстати, в отличие от большинства HTTP, методы (глаголы) чувствительны к регистру:

5.1.1 Метод

Маркер метода указывает метод, который будет выполнен на
ресурс идентифицирован Request-URI. Метод чувствителен к регистру.

   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
30 голосов
/ 15 декабря 2016

tldr; Заголовки HTTP / 1.1 и HTTP / 2 нечувствительны к регистру.

Согласно RFC 7230 (HTTP / 1.1):

Каждое поле заголовка состоит из нечувствительного к регистру имени поля за ним следует двоеточие (":"), необязательный начальный пробел, поле значение и необязательные конечные пробелы.

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

Также RFC 7540 (HTTP / 2):

Как и в HTTP / 1.x, имена полей заголовков являются строками ASCII
символы, которые сравниваются без учета регистра.

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

14 голосов
/ 02 декабря 2015

header('Content-type: image/png') не работал с PHP 5.5, обслуживающим IE11, так как в изображении поток отображался как текст

header('Content-Type: image/png') работал, так как на изображении отображалось только изображение

Разница - это заглавная буква «Т».

4 голосов
/ 06 мая 2016

RFC для HTTP (как упомянуто выше) диктует, что заголовки нечувствительны к регистру, однако вы обнаружите, что в некоторых браузерах (я смотрю на вас, IE) использование заглавных букв в каждом слове имеет тенденцию быть лучшим:

Location: http://stackoverflow.com

Content-Type: text/plain

против

location: http://stackoverflow.com

content-type: text/plain

Это не стандарт "HTTP", а просто еще одна из странностей браузера, о которых мы, как разработчики, должны думать.

1 голос
/ 01 июля 2019

Они не чувствительны к регистру. Фактически, веб-сервер NodeJS явно преобразует их в нижний регистр, прежде чем сделать их доступными в объекте запроса.

Важно отметить, что все заголовки представлены в только в нижнем регистре, независимо от того, как клиент фактически отправил их. это упрощает задачу синтаксического анализа заголовков для любых целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...