Web 内容协商(Content Negotiation)
字数 1154 2025-11-22 20:50:05
Web 内容协商(Content Negotiation)
-
基础概念
Web内容协商是HTTP协议中客户端与服务器就资源传输格式达成一致的机制。当请求同一资源(如URL/document)时,不同用户可能需不同版本(如中文文本、PDF格式或压缩编码)。服务器通过分析请求头中的特定字段,自动返回最合适的资源版本,无需用户手动选择。 -
协商维度与请求头
内容协商主要涉及四个维度,对应不同的HTTP请求头:- 语言协商(
Accept-Language):客户端声明首选自然语言(如en-US, zh-CN;q=0.9,q值表示权重)。 - 字符集协商(
Accept-Charset):指定字符编码(如utf-8),现代浏览器通常默认UTF-8且省略此头。 - 编码协商(
Accept-Encoding):支持压缩格式(如gzip, br表示Brotli压缩)。 - 媒体类型协商(
Accept):定义可处理的MIME类型(如text/html, application/json;q=0.8)。
- 语言协商(
-
服务器决策机制
服务器按以下逻辑选择资源:- 质量值(q-value)排序:解析请求头中每种选项的权重(默认
q=1.0),按优先级降序排列。 - 服务端偏好:若客户端接受多种格式,服务器可内置规则(如默认返回
application/json而非text/xml)。 - 回退策略:若无匹配项,返回406 Not Acceptable状态码或默认版本。
- 质量值(q-value)排序:解析请求头中每种选项的权重(默认
-
协商类型对比
- 服务端协商:标准方式,由服务器处理请求头并决策。优势是隐藏资源多版本细节。
- 客户端协商:服务器返回300 Multiple Choices状态码,列出所有版本,由用户手动选择(现已较少使用)。
- 代理驱动协商:先请求无主体资源,通过响应头(如
Alternates)描述可用版本,再由客户端选择。因往返延迟高,实际应用罕见。
-
Vary响应头的作用
服务器在响应中通过Vary头指示缓存系统区分不同协商结果的请求。例如:
Vary: Accept-Encoding, User-Agent
告知缓存需根据Accept-Encoding和User-Agent字段存储不同版本,避免向移动端返回桌面版压缩资源。 -
实际应用场景
- 多语言网站:根据
Accept-Language返回对应语言HTML,配合hreflang标签提升SEO。 - API版本管理:通过
Accept: application/vnd.api.v2+json区分API版本。 - 自适应图片:结合
Accept: image/webp, image/*为支持WebP的浏览器返回更小体积图片。
- 多语言网站:根据