Accept* HTTP头中的q = 0.5是什么意思?

222
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

这些q=%f是什么意思?

3个回答

287

这被称为相对质量因子。它指定了用户在0到1的范围内更偏好哪种语言,可以从HTTP/1.1规范第14.4节中看到:

每个语言范围可以赋予一个相关联的质量值,该值表示用户对该范围所指定语言的偏好估计。质量值默认为 "q=1"。例如:

  Accept-Language: da, en-gb;q=0.8, en;q=0.7

意思是:“我更喜欢丹麦语,但也接受英式英语和其他类型的英语。”


44
非常好,谢谢!但为什么不按照偏爱的顺序列出它们呢? - kolypto
12
“确切地说,接受80%的符合en-gb要求的内容意味着什么?” - Pacerier
10
为什么不按照语言偏好的顺序进行排序?这个值似乎并不重要,除了它比其他值大之外。 - Rob
7
给@kolypto的消息:参数列表,无论是在URL中还是在头部中,都没有隐含的顺序。 - JP Silvashy
4
我想原因在于更加灵活(你的客户端脚本可以只添加所需类型,而不是确保整个列表始终排序)。但更有趣的原因是它使您的客户端允许服务器决定哪种类型更好!看:如果标准只是一个有序列表,你可以说比如你更喜欢HTML而不是PDF。但是如果你对两者都无所谓呢?而我的网站发送了很棒的PDF和一般的HTML。如果你没有偏好,我更愿意为你发送PDF以让你感到更高兴! - Robo Robok
显示剩余12条评论

42

在规范中,它被称为相对质量因子

每个媒体范围后面可以跟随一个或多个accept-params,以&q;参数开头表示相对质量因子。第一个&q;参数(如果有)将媒体范围参数与accept-params分开。质量因子允许用户或用户代理使用从0到1的qvalue比例尺来指示对该媒体范围的相对偏好程度(第3.9节)。默认值为q = 1。

...

例如:

Accept: audio/*; q=0.2, audio/basic

应该被解释为“我更喜欢音频/基本格式,但如果在质量打折80%后它是最好的可用音频类型,则发送任何音频类型。”

另请参阅:

HTTP / 1.1:报头字段定义


2
我来晚了,但是你说的“质量降低80%”是什么意思?这不应该是指偏好程度而非音频文件的质量吗?还是我理解错了? - Mave
11
实际上,它可能主要用作偏好的度量。然而,在其最初的制定中,我确实认为它是基于编码质量的。例如,考虑FLAC与MP3。你可以说:“如果MP3版本的质量最差只有无损版本的50%,请发送给我MP3版本。如果不是,请发送FLAC版本。”如何量化这样的质量以及是否在实践中使用,我不知道,但我确信这是最初的意图。 - Sebastian Paaske Tørholm
1
@SebastianPaaskeTørholm 我来这里是为了寻找更多关于这个的信息。RFC 7231中只有两个地方似乎暗示了这个次要含义,但我不太清楚它的工作原理,因为这两个含义可能会相互冲突 - 例如,如果qvalue以这种方式被重载,似乎不可能表达对较少损失类型的偏好而不是较少损失类型。 - Semicolon
最受欢迎的语言是否总是在头部的第一个参数? - oldboy
@BugWhisperer,链接的标准有一个更详细的例子,其中它不是第一个。请参考那个。 :) - Sebastian Paaske Tørholm

16

可以这样理解Accept-languages质量参数:

通过将Accept-Language: pl_PL;q=0.8, en_US;q=0.2,头附加到请求中,我们向服务器传达以下消息:

服务器,请为我提供此网站的波兰语翻译,但仅当其质量≥80%的相关质量因素时。如果质量为<80% - 我不介意获取英文版,因为对于我来说它无关紧要,毕竟我会说英语。

例如,作为网页内容提供者,我们可能以这样的方式引入Accept-Language头解析,使我们的网站适用于完全不会讲英语的外国人(即使只翻译导航也会有帮助(只翻译导航的页面,如q=0.1),完全翻译的内容具有q=0.9,同时由讲原始语言和翻译语言的母语人士验证的完全翻译内容可能具有q=0.99 - 因为这是唯一可能出现完全转移内容含义的情况)。


最受欢迎的语言是否总是在头部的第一个参数? - oldboy
@BugWhisperer 是的,但如果你想要非常严格地遵循标准,并且你的翻译相当简单或者不够准确 - 你可能会想跳过第一个值。 - test30
为什么使用第二个值会更加严格? - oldboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接