如果加权 HTTP header 有重复值,权重不同,应该如何处理?

If a weighted HTTP header has duplicate values, with differing weights, how should this be handled?

请求 header 的值,例如 Accept-LanguageAccept-Encoding 等,具有隐式或显式加权值(例如 en; q=0.8)。

万一完整字段值的解析值产生模棱两可的信息,特别是如果模棱两可被解释为不可接受(q=0)或由于某些 non-zero 而可接受质量值,例如:

Accept-Encoding: gzip; q=0.8, gzip; q=0

这应该解释为:

  1. 不可接受;
  2. 可以接受;
  3. header无效;

或者其他一些选择,也许?

RFC 7231, the general section 5.3.1 质量值上

The weight is normalized to a real number in the range 0 through 1, where 0.001 is the least preferred and 1 is the most preferred; a value of 0 means "not acceptable". If no "q" parameter is present, the default weight is 1.

Accept-Encoding-特定的 section 5.3.4,第 3 和 4 小节

  1. If the representation's content-coding is one of the content-codings listed in the Accept-Encoding field, then it is acceptable unless it is accompanied by a qvalue of 0. (As defined in Section 5.3.1, a qvalue of 0 means "not acceptable".)

  2. If multiple content-codings are acceptable, then the acceptable content-coding with the highest non-zero qvalue is preferred.

明确表示 q=0 表示“不可接受”,最高 non-zero qvalue 是首选,但他们似乎没有讨论任何可能的歧义;可能是因为这是一个不太可能发生的事件。

  1. If the representation's content-coding is one of the content-codings listed in the Accept-Encoding field, then it is acceptable unless it is accompanied by a qvalue of 0. (As defined in Section 5.3.1, a qvalue of 0 means "not acceptable".)

  2. If multiple content-codings are acceptable, then the acceptable content-coding with the highest non-zero qvalue is preferred.

header Accept-Encoding: gzip; q=0.8, gzip; q=0 有一个单独的 content-coding gzip 用不同的 qvalues 重复。

  • 首先,它伴随着qvalue 0.8,即"acceptable"
  • 其次,伴随着qvalue0也就是"not-acceptable".

当我阅读引用的规则时:

  1. 检查 content-coding 是否伴随 qvalue 为零;如果是这样,那就是 "not acceptable";
  2. 否则,取所有重复项的最大qvalue权重。

所以我的解释是下面两行是等价的:

Accept-Encoding: gzip, gzip;q=0.001, compress;q=0.1, compress;q=0, *;q=0.2, *;q=0.1
Accept-Encoding: gzip;q=1, compress;q=0, *;q=0.2

对于您的示例,以下两行是相同的:

Accept-Encoding: gzip; q=0.8, gzip; q=0
Accept-Encoding: gzip;q=0