内容协商机制
指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源,内容协商会以响应资源的语言,字符集,编码方式等作为判断的基准
就如一个网站面向英语、法语两种语言的用户,因此理想情况下,该网站就需要向英语用户提供英文版的网站内容、向法语用户提供法文版的网站内容,HTTP内容协商机制就可以在客户端、服务端之间做这样的决定,使得单一的URL就可以代表不同的资源(同一个网站不同语言版本)
内容协商方式
1.客户端驱动
客户端发起请求,服务器返回可选列表,客户端作出选择后发送第二次请求
优点:尊重用户真实意愿
缺点:需要两次请求,增加了时延
2.服务端驱动(现在最常用)
服务器检查客户端的请求头部集并决定提供哪个版本的页面
优点:只要一次请求,相对于客户端驱动更快,并且提供了权重机制(q=0.7…)服务器端可以近似匹配
缺点:客户端、服务端头部集都不匹配时,服务器要进行猜测
客户端-服务器对应的头部集
客户端-请求头 | 服务端-响应头 |
---|---|
Accept:告诉服务器发送何种媒体类型 | Content-Type |
Accept-Language:告诉服务器发送何种语言 | Content-Language |
Accept-Charset:告诉服务器发送何种字符集 | Content-Type |
Accept-Encoding:告诉服务器采用何种编码 | Content-Encoding |
请求头都可以设置权重值来近似匹配
如:Accept-Language:en;q=0.5,fr;q=0.0,nl;q=1.0,tr;q=0.0
表示用户最愿意接受nl(荷兰语),其次是en(英语),不接受fr(法语)和tr(土耳其语)
假如服务器端既没有nl也没有en,这时候服务器端就要进行猜测,通常会设置一个默认,都没有的话就返回默认语言
3.透明协商
某个中间设备(通常是缓存代理)代表客户端进行协商
优点:节省了Web服务器的协商开更快
缺点:不是HTTP标准的协商方式,所以没有相应的规范