内容协商(Content Negotiation)
字数 916 2025-11-17 08:02:10
内容协商(Content Negotiation)
内容协商是HTTP协议中的一种机制,允许客户端和服务器就响应的表现形式(如语言、编码格式、字符集等)进行协商,确保返回的资源版本最符合客户端的需求。
-
基础概念
- 当客户端(如浏览器)请求资源时,可通过HTTP头声明其偏好(如支持的语言、文件格式)。服务器根据这些偏好返回最合适的资源版本,而非固定内容。
- 例如:用户访问多语言网站时,浏览器通过
Accept-Language头声明首选语言,服务器返回对应语言的页面。
-
协商维度
- 语言协商:通过
Accept-Language头指定语言(如en-US, zh-CN)。 - 内容类型协商:通过
Accept头指定支持的MIME类型(如text/html, application/json)。 - 编码协商:通过
Accept-Encoding头声明支持的压缩格式(如gzip, br)。 - 字符集协商:通过
Accept-Charset头指定字符集(如UTF-8)。
- 语言协商:通过
-
协商机制类型
- 服务端驱动协商:客户端提交偏好头,服务器决策并返回资源,同时在响应头中说明所选版本(如
Content-Language)。 - 代理驱动协商:若服务器无法直接决策,返回
300 Multiple Choices响应,列出可选版本,由客户端选择后重新请求。
- 服务端驱动协商:客户端提交偏好头,服务器决策并返回资源,同时在响应头中说明所选版本(如
-
实际应用示例
- 浏览器请求头:
Accept: text/html, application/xhtml+xml Accept-Language: en, fr;q=0.9 Accept-Encoding: gzip - 服务器解析后返回英文HTML内容,并用gzip压缩,响应头包含:
Content-Type: text/html Content-Language: en Content-Encoding: gzip
- 浏览器请求头:
-
技术扩展与优化
- 质量值(q-value):客户端通过
q参数(如fr;q=0.9)表示优先级,数值范围0~1,默认1。 - Vary头:服务器在响应中标注
Vary: Accept-Language,告知缓存服务器根据不同语言缓存多个版本。 - 现代替代方案:如URL参数(
/page?lang=en)或子域名(en.example.com),但内容协商仍保持HTTP协议原生优势。
- 质量值(q-value):客户端通过
-
应用场景
- 多语言网站动态适配用户语言。
- API同时支持JSON和XML格式(通过
Accept头区分)。 - 压缩传输以减少带宽消耗(如自动选择Brotli或gzip)。