2010-07-13 60 views
36

据我所知,HTTP规范允许设置多个具有相同名称的HTTP头。是否有任何用例可以这样做(从客户端到服务器,反之亦然)?设置多个具有相同名称的HTTP标头?

HTTP 1.1 Section 4.2

多个与 消息的报头字段当且仅当该头字段整个 字段值是 定义为相同的字段名可以存在于 消息逗号分隔列表 [即,#(值)]。它必须能够 到所述多个报头字段 组合成一个“字段名:字段值” 对,在不改变的语义信息的 ,由每个 后续字段值附加到所述第一, 每个分离以逗号分隔。因此 在其中接收到具有相同的 字段名的报头字段的顺序 是的 解释合并的字段值显著,因此当消息是 一个 代理不能改变的 这些字段值的顺序转发。

如果我没有错,就不需要多个名称相同的头文件。

+3

“如果我没有错,就不需要多个名称相同的头文件。” - 你说的没错,而且根据你和原始头文件之间的技术情况,它不会被正确支持。 – heisenberg 2010-07-14 13:12:52

+5

我看过重复标题的唯一时间是'Set-Cookie:'。 – TRiG 2011-04-28 16:10:20

+0

相关问题:[是否可以接受重复的HTTP响应头?](http://stackoverflow.com/questions/4371328/are-duplicate-http-response-headers-acceptable)。标题名称的WebDAV标头是[另一个示例](https://github.com/joyent/node/issues/2750)重复项。 – chrisjleu 2014-12-14 10:44:20

回答

17

由于重复标题可能会导致各种网络服务器和API(无论规范说什么)的问题,我怀疑这是最佳实践中的任何通用用例。当然,这并不是说某个地方没有做到这一点。

+0

消息格式和API有不同的要求... – 2010-07-14 05:14:17

+0

内容安全策略旨在处理多个头。请参阅https://twitter.com/mikewest/status/841892857736765443,这会导致问题。 – oreoshake 2017-04-12 19:51:13

4

它只允许使用非常特定的格式,请参阅RFC 2616, Section 4.2

+0

他在问题中表达得很清楚,他意识到自己被允许,这不是他所要求的。 – heisenberg 2010-07-14 13:13:32

+6

该链接虽然非常有帮助。特别是出现多次头部的部分,也必须能够用逗号分隔的值表示为单个头部。 – nategood 2012-09-15 15:16:43

30

它通常用于Set-Cookie:。许多服务器设置多个cookie。

当然,您可以将它们全部设置在一个标题中。

其实,我认为你不能在一个头中设置多个cookie。所以这是一个必要的用例。

Cookie spec确实权利要求,可以在一个头中的相同的方式的其他报头可以被组合(逗号分隔)组合多个cookies,但它也指出,不符合规定的语法(如Expires参数,其具有,其价值)仍然很普遍,必须通过实施来处理。

因此,如果您在Set-Cookie标头中使用Expires参数,并且不希望所有Cookie同时过期,则可能需要使用多个标头。

+0

您可以轻松地将它们设置在一个标头中:Set-Cookie:hello = world; conception = proofed – BronzeByte 2012-02-15 11:50:24

+3

啊,但是你可以在同一个Header中设置不同的cookie吗?说,你可以把它转换成一个头文件吗? Set-Cookie:name1 = value1; Expires = Wed,22 Feb 2012 17:45:00 GMT Set-Cookie:name2 = value2;到期时间= Wed,2021年6月9日10:18:14 GMT – sligocki 2012-02-22 20:45:24

+0

这将在浏览器中保存一个名为Expires的cookie,并被第二个覆盖......我在此期间构建了一个服务器端会话后端,100%安全,超级简单并且可以节省Java对象 – BronzeByte 2012-02-24 16:20:08

0

旧的线程,但我正在研究这个相同的问题。无论如何,Accept和Accept-Encoding标头是使用多个值的逗号分隔的典型示例。即使这些是请求特定的头文件,规范也不会区分这一级别的请求和响应。从此页面检查一个。 规范说的是,如果在标头的值中有逗号作为字符,则不能使用多个相同名称的标头,除非您消除使用逗号的歧义。

1

当您在寻找使用案例时,或许Accept将是有效的。

  • 接受:应用/ JSON
  • 接受:应用/ XML
-1

依我拙见,只有头,其值可以表示(定义)用逗号分隔,可以写成具有单个或多个值的多个标头。

比方说,我们有一个头可以写在逗号分隔列表中的值。

Entries-In-Order: Jane,John,Charlie 

这头值通过有效的定义和服务器或客户端知道它。然后我们可以将它分开为

Entries-In-Order: Jane,John 
Entries-In-Order: Charlie 

但是任何头文件不明白逗号分隔值不能写成多个。

Who-Are-Responsible: John, Jane or maybe Charlie? 

如果按照定义,服务器或客户端可能处理整个字符串(John,Jane,maybe Charlie?)为单一值,写它作为多个标头,将无法正常工作。

My-Dummy-Header: John 
My-Dummy-header: Jane or maybe Charlie? 
+2

这不是你的意见,那是重复已经在问题中的信息。 – hobbs 2016-09-27 22:30:05

相关问题