多个具有相同字段名称的消息头字段只有在整个字段值被定义为逗号分隔列表时才可以出现在消息中。因此,必须能够将多个头字段组合成一个“field-name: field-value”对,而不改变消息的语义,方法是将每个后续的字段值附加到第一个字段值上,每个字段值之间用逗号分隔。因此,接收具有相同字段名称的标头字段的顺序对于解释组合字段值非常重要,因此代理在转发消息时不得更改这些字段值的顺序。
如果我没错的话,没有需要使用相同名称的多个头的情况。
这通常用于Set-Cookie:
。许多服务器设置多个cookie。
当然,您可以在单个标头中设置所有cookie。
实际上,我认为您不能在一个标头中设置多个cookie。因此,这是必要的用例。
Cookie规范(RFC 2109)确实声称您可以将多个cookie组合在一个标头中,就像其他标头可以组合一样(用逗号分隔),但它还指出,不符合语法的语法(例如Expires
参数,在其值中有,
)仍然很常见,并且必须由实现处理。
因此,如果您在Set-Cookie
标头中使用Expires
参数,并且不希望所有cookie同时过期,则可能需要使用多个标头。
RFC 2109已被RFC 2965取代,后者又被RFC 6265取代,该规范对此问题更加严格:
起始服务器不应将多个"Set-Cookie"头字段折叠成单个头字段。HTTP头字段折叠的通常机制(如[RFC2616]所定义)可能会改变"Set-Cookie"头字段的语义,因为"Set-Cookie"使用%x2C(",")字符的方式与此类折叠冲突。RFC 6265在引用将多个头字段合并为一个时使用动词“折叠”,这在HTTP / 1规范(由RFC2616及其后继者RFC 7230确定)的上下文中是模棱两可的,其中:
“折叠”一直指代行折叠,以及
动词“组合”用于描述合并相同的头。
组合头字段:
请参见RFC 2616,第4.2节,消息头(引用问题中的内容),但搜索“combine”一词将显示特殊情况。field-name: field-value
对,通过按顺序将每个后续字段值附加到组合字段值中,并用逗号分隔,而不改变消息的语义。因此,接收具有相同字段名称的标头字段的顺序对于解释组合字段值非常重要;代理在转发消息时不得更改这些字段值的顺序。Set-Cookie
视为特殊情况。(有关详细信息,请参见[Kri2001]的附录A.2.3。)
行折叠:
如果连续行以空格或水平制表符开头,则可以将HTTP/1.1标头字段值折叠到多行上。包括折叠在内的所有线性空白具有与SP相同的语义。接收者可以在解释字段值或向下游转发消息之前将任何线性空白替换为单个SP。
上述部分已被RFC 7230,第3.2.4节,字段解析所取代:
从历史上看,HTTP标头字段值可以通过在每个额外行之前加上至少一个空格或水平制表符(
obs-fold
)来扩展多行。除了在媒体类型中(第8.3.1节)以外,此规范不建议使用此类行折叠。发送方不得生成包含行折叠(即具有任何与obs-fold
规则匹配的字段值)的消息,除非该消息旨在打包到媒体类型中。在请求消息中接收到不在容器中的
obs-fold
的服务器必须拒绝该消息,最好发送一个400(Bad Request
),并解释过时的行折叠是不可接受的,或在解释字段值或向下游转发消息之前将每个接收到的obs-fold
替换为一个或多个SP八位字节。在响应消息中接收到不在容器中的
obs-fold
的代理或网关必须丢弃该消息,并用502(Bad Gateway
)响应替换它,最好解释已接收到不可接受的行折叠,或在解释字段值或向下游转发消息之前将每个接收到的obs-fold替换为一个或多个SP八位字节。在响应消息中接收到不在容器中的
obs-fold
的用户代理必须在解释字段值之前将每个接收到的obs-fold
替换为一个或多个SP八位字节。
因为重复的标题可能会影响各种Web服务器和API(无论规范如何),我怀疑在任何通用用例中这都不是最佳实践。当然,这并不是说某个地方没有人这样做。
如果你正在寻找用例,也许Accept
是一个有效的选项。
只有使用非常特定的格式的标题才被允许,参见RFC 2616,第4.2节。
虽然这是一个旧的帖子,但我也在研究同样的问题。无论如何,Accept和Accept-Encoding头文件都是使用多个值的典型示例,以逗号分隔。即使这些是特定于请求的头文件,规范在此级别上也没有区分请求和响应之间的区别。请查看此页面中的规范。 规范所说的是,如果您在头文件的值中使用逗号作为字符,则不能使用相同名称的多个头文件,除非您消除了逗号的使用歧义。
Set-Cookie:
这个头部出现过重复的情况。 - TRiG