Web 内容协商(Content Negotiation)
字数 1154 2025-11-22 20:50:05

Web 内容协商(Content Negotiation)

  1. 基础概念
    Web内容协商是HTTP协议中客户端与服务器就资源传输格式达成一致的机制。当请求同一资源(如URL /document)时,不同用户可能需不同版本(如中文文本、PDF格式或压缩编码)。服务器通过分析请求头中的特定字段,自动返回最合适的资源版本,无需用户手动选择。

  2. 协商维度与请求头
    内容协商主要涉及四个维度,对应不同的HTTP请求头:

    • 语言协商Accept-Language):客户端声明首选自然语言(如 en-US, zh-CN;q=0.9q值表示权重)。
    • 字符集协商Accept-Charset):指定字符编码(如 utf-8),现代浏览器通常默认UTF-8且省略此头。
    • 编码协商Accept-Encoding):支持压缩格式(如 gzip, br 表示Brotli压缩)。
    • 媒体类型协商Accept):定义可处理的MIME类型(如 text/html, application/json;q=0.8)。
  3. 服务器决策机制
    服务器按以下逻辑选择资源:

    • 质量值(q-value)排序:解析请求头中每种选项的权重(默认q=1.0),按优先级降序排列。
    • 服务端偏好:若客户端接受多种格式,服务器可内置规则(如默认返回application/json而非text/xml)。
    • 回退策略:若无匹配项,返回406 Not Acceptable状态码或默认版本。
  4. 协商类型对比

    • 服务端协商:标准方式,由服务器处理请求头并决策。优势是隐藏资源多版本细节。
    • 客户端协商:服务器返回300 Multiple Choices状态码,列出所有版本,由用户手动选择(现已较少使用)。
    • 代理驱动协商:先请求无主体资源,通过响应头(如Alternates)描述可用版本,再由客户端选择。因往返延迟高,实际应用罕见。
  5. Vary响应头的作用
    服务器在响应中通过Vary头指示缓存系统区分不同协商结果的请求。例如:
    Vary: Accept-Encoding, User-Agent
    告知缓存需根据Accept-EncodingUser-Agent字段存储不同版本,避免向移动端返回桌面版压缩资源。

  6. 实际应用场景

    • 多语言网站:根据Accept-Language返回对应语言HTML,配合hreflang标签提升SEO。
    • API版本管理:通过Accept: application/vnd.api.v2+json区分API版本。
    • 自适应图片:结合Accept: image/webp, image/*为支持WebP的浏览器返回更小体积图片。
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状态码或默认版本。 协商类型对比 服务端协商 :标准方式,由服务器处理请求头并决策。优势是隐藏资源多版本细节。 客户端协商 :服务器返回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的浏览器返回更小体积图片。