Являются ли заголовки HTTP чувствительными к регистру?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Имена заголовков 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

Ответ 3

TL;DR; оба заголовка 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

Ответ 4

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

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

Единственное отличие - это капитал "T".

Ответ 5

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

Location: http://stackoverflow.com

Content-Type: text/plain

против

Location: http://stackoverflow.com

Content-Type: text/plain

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

Ответ 6

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

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