Заголовки HTTP чувствительны к регистру?
В сообщении в блоге я использую следующий PHP, чтобы установить тип содержимого ответа:
header('content-type: application/json; charset=utf-8');
Я только что получил комментарий к этому сообщению о том, что content-type
должен быть написан с заглавной буквы, Content-type
, Это правильно? Кажется, он работает для меня со всеми строчными буквами, и я предположил, что заголовки HTTP не чувствительны к регистру. Или это просто работает, потому что браузеры хороши?
9 ответов
Имена заголовков не чувствительны к регистру.
Из RFC 2616 - "Протокол передачи гипертекста - HTTP / 1.1", раздел 4.2, "Заголовки сообщений":
Каждое поле заголовка состоит из имени, за которым следуют двоеточие (":") и значение поля. Имена полей не чувствительны к регистру.
Обновление RFC 7230 не перечисляет никаких изменений от RFC 2616 в этой части.
Имена заголовков 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
tldr; Заголовки HTTP/1.1 и HTTP/2 нечувствительны к регистру.
Согласно RFC 7230 (HTTP/1.1):
Каждое поле заголовка состоит из нечувствительного к регистру имени поля, за которым следует двоеточие (":"), необязательный начальный пробел, значение поля и необязательный конечный пробел.
https://tools.ietf.org/html/rfc7230
Также RFC 7540 (HTTP/2):
Как и в HTTP/1.x, имена полей заголовков являются строками ASCII
символы, которые сравниваются без учета регистра.
header('Content-type: image/png')
не работал с PHP 5.5, обслуживающим IE11, так как в изображении поток отображался как текст
header('Content-Type: image/png')
работал, как на изображении появился как изображение
Единственная разница - это заглавная буква "Т".
Они не чувствительны к регистру. Фактически, веб-сервер NodeJS явно преобразует их в нижний регистр, прежде чем сделать их доступными в объекте запроса.
Здесь важно отметить, что все заголовки представлены только в нижнем регистре, независимо от того, как клиент их фактически отправил. Это упрощает задачу синтаксического анализа заголовков для любых целей.
Официально заголовки не чувствительны к регистру, однако обычно первая буква каждого слова пишется с заглавной буквы.
но, поскольку это обычная практика, некоторые программы, такие как IE, предполагают, что заголовки пишутся с заглавной буквы.
поэтому, хотя в документах говорится, что регистр не учитывается, плохие программисты в основном изменили документы.
RFC для HTTP (как упомянуто выше) диктует, что заголовки нечувствительны к регистру, однако вы обнаружите, что в некоторых браузерах (я смотрю на вас, IE) использование заглавных букв в каждом слове имеет тенденцию быть лучшим:
Location: http://stackru.com
Content-Type: text/plain
против
location: http://stackru.com
content-type: text/plain
Это не стандарт "HTTP", а просто еще одна из странностей браузера, о которых мы, как разработчики, должны думать.
Я использовал следующий код:
reqObj['headers'] = new Headers({
CSRF: ABCD-DEFG..,
});
Я мог видеть, как он конвертируется в нижний регистр ('csrf'). Будем пересматривать и обновлять с дальнейшими выводами. Однако, поскольку это делает конструктор, я предполагаю, что он должен работать. Следовательно, также кажется, что заголовки нечувствительны к регистру.
Слово Headers не чувствительно к регистру, но справа, как и Content-Type, рекомендуется писать так, потому что оно чувствительно к регистру. как мой пример ниже
headers = headers.set('Content-Type'