重复的 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”那样对待它们?

57996 次浏览

是的

可用的 HTTP RFC2616 给你表示:

可能存在具有相同字段名的多个消息头字段 当且仅当该标头的整个字段值 字段定义为逗号分隔的列表[即 # (值)] 可以将多个头字段合并为一个 “ field-name: field-value”对,而不改变 消息,通过将每个后续字段值附加到第一个字段,每个 用逗号分隔。标题字段中具有相同 因此,接收到的字段名对于解释非常重要 组合字段值,因此代理不能更改 转发消息时这些字段值的顺序

因此,如果整个字段值被定义为以逗号分隔的值列表,那么具有相同名称的多个头是可以的(www-enticate 就是这种情况)。

这里记录了缓存控制: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9如下:

Cache-Control   = "Cache-Control" ":" 1#cache-directive

#1cache-directive语法定义了至少一个缓存指令元素的列表(参见 # value 的正式定义: 符号约定与泛型语法)

所以,是的,

Cache-Control: no-cache, no-store

等同于(秩序是重要的)

Cache-Control: no-cache
Cache-Control: no-store

请注意,HSTS RFC6797通过定义 STS 头的多个实例的行为与 RFC2616(违反了“ if 和 only if”语言)相矛盾,尽管它没有填充逗号分隔值:

  "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."