将单个HTTP标头的多个值添加到请求或响应的标准


70

如果我想将值列表添加为HTTP标头,是否有标准方法可以做到这一点?我在RFC 822中找不到任何内容(我很容易理解)。例如,逗号分隔值是标准值还是分号分隔值。有没有标准?

例:

Key: value1;value2;value3

Answers:


99

您将要查看HTTP规范RFC 2616,其中说:

当且仅当该报头字段的整个字段值定义为以逗号分隔的列表[即,#(值)]时,消息中才会存在多个具有相同字段名称的报头字段。通过将每个后续的字段值附加到第一个字段(每个字段用逗号分隔),必须在不更改消息语义的情况下,将多个报头字段组合成一对“字段名称:field-value”。因此,具有相同字段名称的报头字段的接收顺序对于组合字段值的解释很重要,因此代理在转发消息时不得更改这些字段值的顺序。

这意味着您可以使用不同的值在响应中多次发送相同的标头,只要可以使用逗号将这些值彼此附加即可。这也意味着您可以通过将多个值与逗号连接来在单个标头中发送多个值。

因此,在您的情况下,它将是:

Key: value1,value2,value3

12
当且仅当该标头字段的整个字段值定义为以逗号分隔的列表时,才可以在响应中多次发送具有不同值的相同标头。我认为这是指并非所有标头都允许是一组值的事实。例如,Content-Length必须为单个值。
Cheeso

@ marc-novakowski-我也希望在这个话题上少说几句:)-不要拒绝投票,而是要让我感到自己“不满意”
ceph3us 2016年

如果在同一标头中发送两个冲突的值该怎么办。例如:“ X-Frame-Options:DENY,SAMEORIGIN”。浏览器应如何处理?得到最后一个?
drox '16

12

通过各种方式@ marc-novakowski您可以缩小“问题”的范围:)

通常(按照HTTP规范),我们使用逗号“,”将每个值与其他值分隔

但我们将研究一个简单的案例:

Cookie-set: language=pl; expires=Sat, 15-Jul-2017 23:58:22 GMT; path=/; domain=x.com   
Cookie-set: id=123 expires=Sat, 15-Jul-2017 23:58:22 GMT; path=/; domain=x.com; httponly   

当一个值与另一个值之间用逗号分隔时,如何连接此类标头-出现逗号的情况?

那么“客户”的责任就是选择并决定策略,例如掉落,合并(如果合并如何)?

请看一下nsHttpHeaderArray的Mozilla实现

https://github.com/bnoordhuis/mozilla-central/blob/master/netwerk/protocol/http/nsHttpHeaderArray.h#L185

在这种情况下,mozilla选择使用换行符'\ n'(对于某些标题字段名称)

我鼓励您在遇到这种情况时,搜索常见的现有解决方案-因为它们提供了熟悉的方案


7

但是,并非所有具有相同字段名称的值都可以合并到字段值列表中。例如,在RFC 7230中,我们可以阅读

注意:实际上,“ Set-Cookie”头字段([RFC6265])通常在响应消息中出现多次,并且不使用列表语法,这违反了对同名多个头字段的上述要求。由于不能将其组合为单个字段值,因此接收者在处理标头字段时应作为特殊情况处理“ Set-Cookie”。(有关详细信息,请参见[Kri2001]的附录A.2.3。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.