Допустимы ли дубликаты заголовков ответа HTTP?
Я не нашел никакой спецификации о том, разрешено ли дублирование HTTP-заголовков ответа стандартом, но мне нужно знать, не вызовет ли это проблемы с совместимостью.
Скажем, у меня есть заголовок ответа:
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5
Cache-Control: no-cache
Cache-Control: no-store
Location: http://localhost:9876/foo.bar
Content-Language: en-US
Content-Length: 0
Date: Mon, 06 Dec 2010 21:18:26 GMT
Обратите внимание, что есть два Cache-Control
Заголовки с разными значениями. Браузеры всегда относятся к ним так, как будто они написаны как "Cache-Control: no-cache, no-store"?
1 ответ
HTTP RFC2616, доступный здесь, говорит:
Несколько полей заголовка сообщения с одним и тем же именем поля МОГУТ присутствовать в сообщении тогда и только тогда, когда все значение поля для этого поля заголовка определено как список, разделенный запятыми [т.е. #(значения)]. ДОЛЖНО быть возможно объединить несколько полей заголовка в одну пару "имя-поля: поле-значение", не изменяя семантику сообщения, добавляя каждое последующее значение поля к первому, каждое из которых разделяется запятой. Порядок, в котором принимаются поля заголовка с одинаковым именем поля, поэтому важен для интерпретации объединенного значения поля, и, следовательно, прокси НЕ ДОЛЖЕН изменять порядок этих значений поля при пересылке сообщения.
Таким образом, можно использовать несколько заголовков с одним и тем же именем (в таком случае используется www-authenticate), если все значение поля определено в виде списка значений, разделенных запятыми.
Контроль кэша задокументирован здесь: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html например так:
Cache-Control = "Cache-Control" ":" 1#cache-directive
#1cache-directive
синтаксис определяет список по крайней мере одного элемента директивы кэша (формальное определение #values: условные обозначения и общая грамматика см. здесь)
Так да,
Cache-Control: no-cache, no-store
эквивалентно (порядок важен)
Cache-Control: no-cache
Cache-Control: no-store
Обратите внимание, что HSTS RFC6797 противоречит RFC2616 (нарушая язык "если и только если"), определяя поведение для нескольких экземпляров заголовка STS, хотя он не заполняется значениями, разделенными запятыми:
"If a UA receives more than one STS header field in an HTTP
response message over secure transport, then the UA MUST process
only the first such header field."