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

Posted

技术标签:

【中文标题】将单个 HTTP 标头的多个值添加到请求或响应的标准【英文标题】:Standard for adding multiple values of a single HTTP Header to a request or response 【发布时间】:2022-01-14 09:43:34 【问题描述】:

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

例子:

Key: value1;value2;value3

【问题讨论】:

【参考方案1】:

您需要看一下 HTTP 规范 RFC 2616,它说:

多个消息头字段 相同的字段名可能出现在 当且仅当整个消息 该标头字段的字段值是 定义为逗号分隔的列表 [即,#(值)]。必须是可能的 组合多个标题字段 成一个“字段名:字段值” 对,不改变语义 的消息,通过附加每个 第一个的后续字段值, 每个用逗号分隔。命令 在哪些头字段中具有相同的 因此,收到的字段名是 意义重大的解释 组合的字段值,因此 代理不得更改 消息时的这些字段值 转发。

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

所以你的情况是:

Key: value1,value2,value3

【讨论】:

您可以在具有不同值的响应中多次发送相同的标头当且仅当该标头字段的整个字段值定义为逗号分隔列表 .我认为这是指并非所有标题都允许成为一组值的事实。例如,Content-Length 必须是单个值。 @marc-novakowski - 我也希望在这个主题中说几句话:) - 不要拒绝投票,而是让你感觉我“不满意” 如果在同一个标​​头中发送两个冲突的值怎么办。例如:“X-Frame-Options: DENY, SAMEORIGIN”。浏览器应该如何处理呢?拿到最后一个?【参考方案2】:

无论如何@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   

当一个值与另一个值用逗号分隔时,如何加入此类标题 - 逗号可能出现的情况???

那么“客户”的责任是选择并决定策略,例如drop、merg(如果merg如何)?

请查看 nsHttpHeaderArray

的 Mozilla 实现

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

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

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

标志说明:

Cookie 不属于 HTTP 标准。 Cookie 定义在 自己的 RFC,6265(正式为 2965 和 2109)。即使只有 HTTP 2 RFC 提到了 cookie,但没有将它们定义为标准的一部分。 – @mecki 8 月 25 日 18:56

请多看一遍句子

根据 HTTP 规范,我们使用逗号 ',' 将每个值与其他值分隔 - 这里没有单词 cookie :)

也许我们需要准确地说我们在这里讨论的标题字段(s - 当重复它们时)“Cookie-set”是一个标题字段并且它具有价值..那些我们认为是“COOKIE/S” - 因此客户端/服务器实现应该处理这样的“COOKIE/S”

在 HTTP 1/1 规范中查看值或名称对:)

https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.2

【讨论】:

Cookie 不属于 HTTP 标准。 Cookie 在自己的 RFC 6265(正式名称为 2965 和 2109)中定义。甚至 HTTP 2 RFC 也只提到了 cookie,但并未将它们定义为标准的一部分。 @Mecki - 请参阅编辑【参考方案3】:

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

注意:在实践中,“Set-Cookie”标头字段([RFC6265])通常 在响应消息中出现多次并且不使用 列表语法,违反以上对多头的要求 具有相同名称的字段。因为它不能组合成一个 单个字段值,收件人应将“Set-Cookie”作为 处理标题字段时的特殊情况。 (见附录 A.2.3 [Kri2001] 的详细信息。)

【讨论】:

以上是关于将单个 HTTP 标头的多个值添加到请求或响应的标准的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?

如何将承载令牌添加到 HTTP 请求的标头?

如何使用js或jQuery向ajax请求添加自定义HTTP标头?

Google Batch API,多个授权标头

keycloak 客户端协议映射器(脚本映射器)将请求标头添加到令牌中

HTTP协议header标头详解