如何解释空HTTP接受头?(How to interpret empty HTTP Accept h

2019-06-27 10:02发布

的HTTP / 1.1 Accept请求报头中指定RFC 2616,第14.1节 。

它的语法给出如下:

   Accept         = "Accept" ":"
                    #( media-range [ accept-params ] )

#无任何数目根据规定零个或多个 第2.1节 。 不过,第14.1不作如何解释的空任何声明Accept头。 这是相对于部14.2 ,其中谈到Accept-Encoding ,这里不仅1#被使用( 一个或多个 ),也为空的情况下Accept-Encoding被指定的报头,这是一种很奇怪。 处理请求头其他一些板块也特定于空值的特殊情况。

如果一个把一个空的 Accept等效头不存在 Accept头? 有没有错过这个我任何官方资源?

Answer 1:

从RFC2616 Sec4.2 :

每个报头字段包含一个名称后面跟着冒号(“:”)和字段值。

乍一看,这似乎提出,在畸形的,不符合要求的类别指定空的标头值的消息。 然而,在列出的扩充BNF形式RFC2616 SEC2.1表明,

“#element”允许任何数目,包括零

由于这是用于指定Accept头值的声明,似乎空值是有效的。

解析空标题和标题只包含空格可能是因为从规范下列方向的问题:

场含量不包括任何前导或尾随LWS:场值的第一非空白字符之前或场值的最后一个非空白字符之后出现的线性空白。 例如前导或尾随LWS可以在不改变的字段值的语义被移除。 该字段内容之间发生的任何LWS可以与单个SP解释字段值或下游转发该消息之前进行更换。

IMHO,发送空报头是完全没有意义的。 它不应该做的,和解析器可能无法正确解析这些头。 传统上,谁想要避免与不符合要求的部件打交道时,这种限制人指定的“伪空”这样的价值观:

X-MyCustomHeader: ""

如果你只是想验证一个报头字段进行某种形式的布尔开关的发送,考虑派遣像上面,而不是一个空值的占位符值。


更新

我想我是没有直接回答这个问题很清楚:在一个空的情况下,接受头你真的有两个选择:

  • 发送406 Not Acceptable响应通知客户,你不提供任何类型的内容为空接受值(杜)。

这是有道理的,但不是必需的RFC2616 Sec14.1 :

如果Accept首部字段的存在,并且如果服务器不能发送根据所述组合接受字段值这是可以接受的响应,那么服务器应该发送一个406(不可接受)响应。

  • 或者,因为这不是必需的,这是极不可能的用户不接受任何内容类型(否则,为什么他们会打扰到发送请求?)......我会建议治疗空Accept:值(如果消息拒绝是不是一个选项)一样Accept: */*


Answer 2:

据http://tools.ietf.org/html/rfc7231#section-5.3.2 :

没有任何Accept报头字段的请求意味着用户代理将接受响应中的任何介质类型。

你应该把不存在的Accept头为*/*



文章来源: How to interpret empty HTTP Accept header?