http通信中的内容协商

考虑这样的一种情况,服务器对于某个资源有好几个不同的版本,当浏览器发送请求过来的时候,服务器会提供一个最合适的版本给浏览器。

举个例子来说,对于某个网站的主页,服务器可能有“汉语”、“英语”、“法语”,好几个不同的版本,当浏览器发送请求过来的时候,服务器需要判断,到底给浏览器哪个语言的版本比较合适。

服务器为了确定这个比较合适的版本,需要和浏览器进行一些沟通,这个沟通的过程,就是内容协商。

内容协商的过程


那服务器和浏览器是如何进行沟通的呢?目前主流的方法是通过使用请求中一些头部信息来完成这一沟通的,浏览器在发送请求的请求中放置一些头部信息,告诉服务器我需要什么样的数据,然后服务器返回相应版本的数据。

主要使用的请求头有:

1、Accept
2、Accept-Language
3、Accept-Encoding

Accept


accept主要是告诉服务器,浏览器能够接受什么样的数据类型,比如能够接受图片类型的数据,或者能够接受一个xml文件,当然了,浏览器一般可以接受的数据类型是有很多种的,因此一个accept头信息可能是:

accept: text/html, image/jpeg, image/gif, application/pdf

他表示浏览器可以接受htmljpeg图片、pdf三种文件类型,根据这个头部,服务器在发送数据的时候,就要充分考虑浏览器能不能接受。

有的同学可能会问了,如果服务器发送了一份数据,浏览器怎么知道它是什么类型的数据呢?
服务器在给浏览器发送响应数据的时候,也会有头部信息,其中的一个头叫做Content-Type,它会告诉浏览器,我发给你的是什么类型的数据。

那假如对于一份数据,服务器有不同数据类型的版本,即有html类型的,也有jpeg类型的,那么发送哪个版本比较合适呢?
浏览器在accept中可以使用一个叫q的参数,告诉服务器哪些数据类型比较推荐发送。

accept: text/html, image/jpeg; q=0.3, image/gif; q=0.5, application/pdf

如上,浏览器可以接受jpeg、和gif两种类型的图片,但是gif类型的q值是0.5,比较高,q值越高,表示这种数据类型越合适。

那对于text/html并没有制定q值,那这时候表会取q的默认值1,也就是说,text/html等同于text/html; q=1

Accept-Charset


Accept-Charset表示浏览器支持的字符集编码,比如支持utf-8或者gb2312

Accept-Charset: ISO-8859-1,gb2312,utf-8;q=0.7,*;q=0.3

上面表示,浏览器支持ISO-8859-1gb2312utf-8*等字符集,*表示其他任意的字符集,其中的q值表示,浏览器优先支持ISO-8859-1gb2312字符集(默认的q值为1),但是对于utf-8字符集,它的支持权重为0.7,其他字符集的权重为0.3

如果服务器那边有多个字符集版本的资源,那么发送的时候应该优选发送ISO-8859-1gb2312这两个版本,假如服务器那边没有这两个版本那么就推荐发送utf-8版本,实在不行,在发送其他的版本。

Accept-Encoding


在服务器发送数据给浏览器的时候,为了减少数据量,加快发送速度,服务器可以对数据进行压缩,由于服务器给浏览器发送的数据一般是html文本,对于这种文本数据,gzipdeflate这两种压缩算法都有比较好的压缩效果,可以达到原内容的40%。

Accept-Encoding头就是用于浏览器告诉服务器,我希望你发送的数据是压缩过的,并且使用的压缩算法是我指定的:

Accept-Encoding: gzip; q=0.9, deflate; q=0.7

上面表示,浏览器支持gzipdeflate两种压缩算法,但是推荐服务器使用gzip来压缩,因为它的q值比较高,如果服务器发送过来的数据用的压缩算法浏览器不支持,那么就会出错。

还有一个问题是,浏览器怎么知道服务器用了何种压缩算法呢?
同样,服务器发送的响应中,有一个对应的头部:Content-Encoding,会告诉浏览器,使用了什么样的压缩算法。

Accept-Language


如果一个网站支持多语言,一般会用到这个头信息,Accept-Language主要是告诉服务器,当前用户比较擅长某种语言(中文、英文等),建议服务器发送这种语言的页面过来:

Accept-Language: zh-CN,fr-FR;q=0.5

zh-CN表示中文,fr-FR表示法语,上面表示,浏览器希望服务器发送zh-CN中文版本的页面,因为它的q值是1,如果没有中文的,那就发送法语版本的。

那浏览器根据什么来判断,什么语言比较合适用户呢?

浏览器一般会根据用户的操作系统(比如中国一般用的是中文版的操作系统)来给予语言方面的建议,有的浏览器本身就有各种语言的版本,也可以根据自己的版本信息来进行判断。

Vary


在网络当中,浏览器和服务器并不是直接进行通信的,在他们中间往往有很多的代理服务器:

浏览器=>代理服务器1=>代理服务器2=>...=>服务器

其中的代理服务器一般具有缓存的功能,现在假设,一个浏览器发送了请求,要求服务器提供压缩版本的数据,这个数据返回后,会被缓存在代理服务器中,然后,另外一个浏览器发送了请求同样数据的请求,但是不是压缩版本的,这个时候就容易发生问题。

当第二个请求到达代理服务器的时候,代理服务器发现请求的资源已经缓存起来了,就会把的压缩版本资源返回,这样就会导致错误。

Vary头是服务器返回响应的时候,放置在响应头当中的,用来告诉这些代理服务器,当你缓存我的时候,需要补上对应的请求中的一些头信息作为我的版本信息,这样下个请求过来的时候,除了判断是不是相同的url,还需要判断版本信息是不是一样的,最后来决定是不是使用缓存:

Vary: Accept-Encoding, Accept

上面的头信息是告诉代理服务器,缓存我(响应)的时候,你需要加上对应请求当中的Accept-EncodingAccept信息,这样,如果下个请求当中的Accept-EncodingAccept信息和缓存中的不一致,就会认为缓存不可用。

为什么代理服务器在检测版本的时候,不使用响应头Content-*头呢?
原因是有些代理服务器会自动忽略掉响应当中的一些头,比如响应中的Content-Encoding头,这样代理服务器就根本不知道这个响应数据是不是经过压缩的了。

参考链接:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267