Являются ли заголовки 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 и заголовки