Имеет ли значение порядок заголовков в ответе HTTP?

Имеет ли смысл когда-либо порядок заголовков

A: 1
B: 2

против

B:2
A:1

Я пытаюсь выяснить, могу ли я использовать словарь для хранения списка заголовков или это должен быть какой-то список или упорядоченный словарь.

5 ответов

Решение

Нет, это не имеет значения для заголовков с разными именами. См. RFC 2616, раздел 4.2:

Порядок получения полей заголовков с разными именами не имеет значения. Тем не менее, это "хорошая практика" - сначала отправлять поля общего заголовка, затем поля заголовка запроса или заголовка ответа и заканчивать полями заголовка объекта.

Это имеет значение, однако, для нескольких заголовков с одинаковым именем:

Несколько полей заголовка сообщения с одним и тем же именем поля МОГУТ присутствовать в сообщении тогда и только тогда, когда все значение поля для этого поля заголовка определено как список, разделенный запятыми [т.е. #(значения)]. ДОЛЖНО быть возможно объединить несколько полей заголовка в одну пару "имя-поля: поле-значение", не изменяя семантику сообщения, добавляя каждое последующее значение поля к первому, каждое из которых разделяется запятой. Порядок, в котором принимаются поля заголовка с одинаковым именем поля, поэтому важен для интерпретации объединенного значения поля, и, следовательно, прокси-сервер НЕ ДОЛЖЕН изменять порядок этих значений поля при пересылке сообщения.

Порядок заголовков не должен иметь значения. Могут быть "более слабые" реализации стандарта HTTP, где порядок имеет значение, но в целом это не должно быть.

Вот ссылка, которая описывает заголовки HTTP:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html

Заголовки HTTP не зависят друг от друга, и вы можете использовать словарь для их хранения, не беспокоясь об их порядке.

Это также может иметь значение при указании set-cookie несколько раз за одно и то же печенье:

"Set-Cookie: COOKIE1=VALUE1; ...
"Set-Cookie: COOKIE1=VALUE2; ...

В этом случае, COOKIE1 будет установлен в VALUE2и, если порядок изменился:

"Set-Cookie: COOKIE1=VALUE2; ...
"Set-Cookie: COOKIE1=VALUE1; ...

COOKIE1 будет установлен в VALUE1

RFC 7230, раздел 3.2.2: Field Order специально решает этот вопрос. Здесь приведены цитаты из этого раздела спецификации с акцентом, добавленным мной:

Порядок получения полей заголовков с разными именами не имеет значения.

Далее мы уточняем это с пометкой о хорошей практике ради производительности:

Однако рекомендуется сначала отправлять поля заголовка, которые содержат управляющие данные, такие как "Хост по запросам" и "Дата по ответам", чтобы реализации могли решить, когда обрабатывать сообщение как можно раньше.

В некоторых случаях допустимо, чтобы сообщение содержало несколько полей заголовка с одним и тем же именем. В этом случае порядок имеет значение.

Получатель МОЖЕТ объединить несколько полей заголовка с одним и тем же именем поля в одну пару "field-name: field-value", не изменяя семантику сообщения, добавляя каждое последующее значение поля в объединенное значение поля по порядку, разделяя их запятая. Порядок, в котором принимаются поля заголовка с одинаковым именем поля, имеет значение для интерпретации значения объединенного поля.

Другие вопросы по тегам