506 变体协商

HTTP 506 Variant Also Negotiates 服务器错误响应 状态码在透明内容协商 (TCN) 过程中返回,当在选择资源的过程中存在递归循环时。

透明内容协商允许客户端和服务器在服务器具有多个变体时协作决定给定资源的最佳变体。服务器由于服务器错误配置导致在创建响应时产生循环引用而发送 506 状态码。

由于实现的复杂性、客户端自动从响应中选择的方式缺乏标准化以及导致客户端-服务器交互速度变慢的额外往返次数,大多数现代浏览器都不支持透明内容协商。 服务器驱动内容协商 远更为常见,其中服务器根据请求头(Accept-LanguageAccept 等)直接为客户端选择最合适的资源。

状态

http
506 Variant Also Negotiates

规范

规范
RFC 2295
# 第 8.1 节

示例

具有变体的资源

在以下示例中,客户端使用 Accept-Language 标头请求 fr 语言环境中的页面。这可以使用 curl 执行

bash
curl  -H "Negotiate: trans" -H "Accept-Language: fr;" http://example.com/index

这会产生以下请求

http
GET /index HTTP/1.1
Host: example.com
User-Agent: curl/8.7.1
Accept: */*
Negotiate: trans
Accept-Language: fr

由于服务器错误配置,fr 的变体响应指向一个 类型映射,它本身会导致执行透明协商。服务器可以通过在发送之前在选择响应中存在 TCN 标头来检测此条件

http
HTTP/1.1 506 Variant Also Negotiates
Date: Mon, 22 Jul 2024 10:00:00 GMT
Server: Apache/2.4.41 (Unix)
Content-Type: text/html; charset=UTF-8
Content-Length: 233
TCN: list
Vary: negotiate,accept-language
Alternates: {"index.html.en" 1 {type text/html} {language en} {length 48}}, {"another-map.html.fr.map" 1 {type text/html} {language fr} {length 45}}}}

<html>
<head>
  <title>506 Variant Also Negotiates</title>
</head>
<body>
  <h1>Variant Also Negotiates</h1>
  <p>A variant for the requested resource is itself a negotiable resource. This indicates a configuration error.</p>
</body>
</html>

另请参阅