Заголовки 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
символы, которые сравниваются без учета регистра.

https://tools.ietf.org/html/rfc7540

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'
Другие вопросы по тегам