内容协商 (Content Negotiation) 是 HTTP 通信中客户端 (浏览器) 与服务器协商所请求资源最优表现形式的机制。同一 URL 可以根据用户的语言设置、设备类型和支持的格式返回不同的内容。
内容协商主要通过 HTTP 请求头实现。Accept 头部 (支持的媒体类型:text/html、application/json 等)、Accept-Language 头部 (期望的语言:ja、en-US 等)、Accept-Encoding 头部 (支持的压缩方式:gzip、br 等) 是最常见的协商头部。
多语言网站中的内容协商与短链接密切相关。同一短链接被点击后,可以根据用户浏览器的语言设置重定向到中文页面或英文页面。但从 SEO 角度来看,更推荐为每种语言设置独立的 URL 并通过 hreflang 标签关联。基于内容协商的语言切换可能导致搜索引擎无法正确索引各语言版本。
API 设计中内容协商同样重要。短链接服务的 API 根据 Accept 头部返回 JSON 或 XML 响应是常见做法。RESTful API 设计原则推荐为同一资源提供多种表现形式。
内容协商分为服务器驱动型 (服务器根据请求头判断) 和代理驱动型 (服务器提供选项由客户端选择) 两种。Web 领域中前者的使用远为普遍。相关书籍可在 Amazon 上查阅。