首页/网络/协议速查/506 Variant Also Negotiates
HTTP 方法与状态码91 条

506 Variant Also Negotiates

透明内容协商配置循环时的错误:选中的变体资源自身又参与协商,导致循环。

协议速查网络更新于 2026-10-13

506 是什么

506 Variant Also Negotiates 是透明内容协商(TCN,RFC 2295)这套实验框架留下的错误码:服务器在选择变体时发现「被选中的变体自身又声明要参与协商」,形成循环,于是返回 506。现代内容协商用 Vary 与表示元数据实现,不会产生这种循环。

基本信息

名称506 Variant Also Negotiates
类别5xx(服务器配置错误)
规范RFC 2295 §8.1(透明内容协商实验框架)
成因协商选出的变体本身又是协商资源
现状几乎绝迹,标准实现不会返回
常见来源自研或历史遗留的协商中间件

典型使用场景

  • 阅读遗留 TCN 配置文档时理解该错误的含义
  • 老中间件或实验性网关的异常响应分析
  • 内容协商机制演进理解(TCN 到 Vary 加表示元数据)
  • 排障:确认 506 是否来自自研或历史协商逻辑
  • 缓存设计评审:确认协商响应是否正确携带 Vary
  • 协议历史学习:了解该框架为何被放弃

循环成因与现代做法

循环成因与现代做法
# TCN 的循环成因示意
协商资源 /index,声明变体 /index.zh 与 /index.en
若 /index.zh 自身也带协商属性 → 选择循环 → 506

# 现代等价做法:一个 URL 加内容协商头
# Vary: Accept-Language
# 服务端据此返回对应语言版本,不再让客户端挑变体

协商机制对比

机制配置方式现状
TCNAlternates 头加变体声明实验性,已被放弃
现代内容协商Vary 头加 Accept 系列头主流做法
客户端选择300 Multiple Choices极少使用
按地理分流Anycast 或 CDN 规则网络层机制,与 HTTP 无关
506 属于服务器配置错误(5xx),出现时应检查协商资源是否被错误地配置成了自身的变体。
RFC 2295 的 TCN 框架后来被简化,实践证明「每个变体一个 URL 加 Vary」更容易被缓存与 CDN 正确处理。
用 Vary 时若遗漏关键请求头,缓存会把不同语言或编码的响应互相串味,这类问题比 506 更难排查。
现代框架与 CDN 基本不实现 TCN,因此非 WebDAV 场景下遇到 506 多半来自自研中间件。
排查时先确认协商算法是否可能把协商入口自身当成候选,这是产生循环最直接的原因。

易错点

  • 自研协商逻辑把协商资源本身列为候选变体,会稳定返回 506:候选列表必须排除协商入口自身
  • 用 Vary 时遗漏关键请求头,会让缓存把不同版本的响应互相覆盖
  • 在 CDN 场景沿用 TCN 式配置,缓存命中率与正确性都不受控
  • 把 506 当 500 处理,会漏掉「配置循环」这一明确原因
  • 老中间件保留 TCN 行为却不维护,可能在新版本 CDN 上线后突然全面失效

数据来源与参考

  • RFC 2295 §8.1(Transparent Content Negotiation)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌