是否可以接受重复的HTTP响应标头?

Su *_*ang 114 http-headers

我还没有找到关于标准是否允许重复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
Run Code Online (Sandbox Code Playgroud)

请注意,有两个Cache-Control标头具有不同的值.浏览器是否总是将它们视为"Cache-Control:no-cache,no-store"?

Sim*_*ier 141

这里提供的HTTP RFC2616 说:

当且仅当该头字段的整个字段值被定义为以逗号分隔的列表[即,#(值)]时,具有相同字段名的多个消息头字段可以存在于消息中.必须可以将多个头字段组合成一个"字段名:字段 - 值"对,而不改变消息的语义,方法是将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔.因此,接收具有相同字段名称的头字段的顺序对于组合字段值的解释是重要的,因此代理不得在转发消息时改变这些字段值的顺序.

因此,如果将整个字段值定义为以逗号分隔的值列表,则具有相同名称的多个标头即可(www-authenticate就是这种情况).

缓存控制在此处记录:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9,如下所示:

Cache-Control   = "Cache-Control" ":" 1#cache-directive
Run Code Online (Sandbox Code Playgroud)

#1cache-directive语法定义至少一个缓存指令元素列表(在这里看到#values的正式定义:符号约定和一般语法)

所以,是的,

Cache-Control: no-cache, no-store
Run Code Online (Sandbox Code Playgroud)

相当于(顺序很重要)

Cache-Control: no-cache
Cache-Control: no-store
Run Code Online (Sandbox Code Playgroud)

  • “当且仅当该标头字段的整个字段值被定义为逗号分隔的列表”——对我来说,这听起来像多个值*必须*被定义为逗号分隔的列表,即,它们可以'不能拆分为单独的标头。 (3认同)
  • 谢谢你的快速回复,西蒙!但RFC 2616引用的段落是否也适用于Cache-Control?我错过了什么吗? (2认同)
  • @mark - "定义为以逗号分隔的列表"这里的意思是"在BNF语法中定义为以逗号分隔的列表".Cache-control字段的确定义为(x#blahblah). (2认同)
  • 较新的 RFC 7230 中讨论处理多个标头的部分是 https://tools.ietf.org/html/rfc7230#section-3.2.2 (2认同)