Чи заголовки HTTP відрізняються від регістру?


712

У публікації в блозі я використовую наступний PHP для встановлення типу вмісту відповіді:

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

Я тільки що отримав коментар на цю посаду , сказавши , що content-typeпотреби бути капіталізовані, Content-type. Це правильно? Здається, це працює для мене з усіх малих регістрів, і я вважав, що заголовки HTTP не залежать від регістру. Або це просто працює, тому що браузери приємні?


26
Це нечутливе до регістру, але якщо ви збираєтеся виправити справу, це має бути "Content-Type".
mc0e

10
FWIW, надсилати "charset" з додатком / json безглуздо. Такого параметра немає.
Джуліян Решке

5
@JulianReschke - Це неправда, charset є дійсним параметром у заголовку Content-Type. Дивіться w3.org/International/articles/http-charset/index та developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
cchamberlain

8
@NullUserException - зворотний бік (окрім витрачених байтів) полягає в тому, щоб продовжувати плутати людей з приводу параметри шаблонів. Просто замініть ці компоненти.
Юліан Решке

10
@JulianReschke правильний. У прикладанні IANA / json, призначеному для цього медіа, діапазон не має сенсу. це нічого не робить. Будь ласка, не додайте його, тому що саме шум призводить до зайвої плутанини.
Відновіть Моніку 2331977

Відповіді:


934

Назви заголовків не відрізняються від регістру.

З RFC 2616 - "Протокол передачі гіпертексту - HTTP / 1.1" , розділ 4.2, "Заголовки повідомлень" :

Кожне поле заголовка складається з імені, за яким слідує двокрапка (":") та значення поля. Назви полів залежать від регістру.

Оновлення RFC 7230 не містить жодних змін у RFC 2616 в цій частині.


96
Відповідь досі вірна, RFC 7230 зазначає: "Кожне поле заголовка складається з нечутливого до регістру імені поля з двокрапкою (": "), необов'язкового провідного пробілу, значення поля та необов'язкового пробільного пробілу."
Мартін Мюллер

6
Поля заголовка залежать від регістру при використанні PHP для отримання значення поля заголовка за допомогою методу 'apache_request_headers ()'.
Шарм

7
Чи може хтось надати приклади популярних браузерів, які не відповідають специфікаціям у цьому плані?
David W

7
@Harm Це лише тому, що порівняння рядків у PHP залежить від регістру.
MrWhite

7
Для тих, хто шукає, тут RFC 7230 прямо зазначає, що заголовки поля повинні трактуватися як нечутливі до регістру: tools.ietf.org/html/rfc7230#section-3.2
JZ

238

Відповідно до RFC 2616, назви заголовків HTTP не залежать від регістру :

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

Ще один коментар сказав, що ця відповідь застаріла. Це правда? Якщо так, можливо, ви можете оновити його, щоб люди не плуталися.
швидкісний літак

36

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


19
лише уточнення: назви полів нечутливі до регістру; значення полів можуть бути залежними від регістру, залежно від назви поля.
Юліан Решке

7
Продовження цитування з HTTP / 2 RFC: "Однак імена полів заголовка ОБОВ'ЯЗКОВО перетворити на малі регістри перед кодуванням у HTTP / 2. Запит чи відповідь, що містить назви полів верхнього регістру, ОБОВ'ЯЗКОВО трактуватись як неправильно сформовані (Розділ 8.1.2.6)"
Борек Бернар

1
Я щойно помітив, що "ПОВИННО перетворити на малі регістри ...". Чому так? Здається, CamelCase вважається кращим корпусом на практиці (інструменти розробників, популярні бібліотеки коду), то чому б HTTP / 2 намагалася йти проти цієї тенденції?
jimp

7
@jimp - оскільки стандарти стосуються послідовності - використання верблюда може бути неоднозначним, особливо з абревіатурами, ініціалізаціями та абревіатурами. Наприклад - чи буде це "Front-End-Https" або "Front-End-HTTPS" - "WWW-Authenticate" або "Www-Authenticate" - вказуючи всі малі регістри, вилучає неоднозначність шляхом стандартизації поля. Це, в свою чергу, спрощує обробку заголовків у всьому напрямку.
Фрейзер

16

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

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

Різниця лише в капіталі "T".


18
Тоді, очевидно, виникає проблема з реалізацією, оскільки всі поля заголовка повинні читатися як нечутливі до регістру. Апач-лава також псується. Це не подобається імен малих полів.
облігація

8

Вони не враховують регістр. Насправді веб-сервер NodeJS явно перетворює їх у малі регістри , перш ніж зробити їх доступними в об'єкт запиту.

Тут важливо зауважити, що всі заголовки представлені лише малі регістри, незалежно від того, як клієнт насправді їх надіслав. Це спрощує завдання розбору заголовків з будь-якою метою.


Це тому, що вузол / javascript чутливий до регістру, тому для спрощення речей вони нормалізують все на малі регістри, тобто заголовки HTTP по суті є нечутливими до регістру.
Svish

4

RFC для HTTP (як зазначено вище) вказує на те, що заголовки не чутливі до регістру, проте ви побачите, що з певними браузерами (я дивлюся на вас, IE), що з великої літери використовують кожне зі слів, як правило, найкраще:

Location: http://stackoverflow.com

Content-Type: text/plain

проти

location: http://stackoverflow.com

content-type: text/plain

Це не стандарт "HTTP", а лише черговий вигадок браузера, який ми, як розробники, повинні думати.


3
Чи можете ви надати якісь докази на це?
Джуліян Решке

3
Я мав на увазі конкретний тестовий випадок; У мене є IE для тестування.
Джуліян Решке

11
Чому саме вона, як правило, найкраща?
Свиш

Я зроблю браузер, який надсилає заголовки з випадковою
великою літерою

0

Офіційно заголовки не чутливі до регістру, однак загальною практикою є використання великих літер у кожному слові.
але, оскільки це звичайна практика, деякі програми, такі як IE, припускають, що заголовки використовуються з великої літери.
тому, хоча документи кажуть, що вони нечутливі до регістру, погані програмісти в основному змінили документи.


-4

Слово заголовків не враховує великі регістри, але праворуч, як Content-Type, є хорошою практикою писати це таким чином, оскільки його регістр є чутливим. як мій приклад нижче

headers = headers.set('Content-Type'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.