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