Чувствительны ли заголовки HTTP к регистру?

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

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

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

5 ответов


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

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

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

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


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

4.2:

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

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

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


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

5.1.1 метод

маркер метода указывает на метод, который будет выполняться на
ресурсы, определенные Запрос 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

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


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

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

единственная разница-это столица "T".


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

Location: http://stackoverflow.com

Content-Type: text/plain

vs

location: http://stackoverflow.com

content-type: text/plain

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