506 变体协商
HTTP 506 Variant Also Negotiates
服务器错误响应 状态码在透明内容协商 (TCN) 过程中返回,当在选择资源的过程中存在递归循环时。
透明内容协商允许客户端和服务器在服务器具有多个变体时协作决定给定资源的最佳变体。服务器由于服务器错误配置导致在创建响应时产生循环引用而发送 506
状态码。
由于实现的复杂性、客户端自动从响应中选择的方式缺乏标准化以及导致客户端-服务器交互速度变慢的额外往返次数,大多数现代浏览器都不支持透明内容协商。 服务器驱动内容协商 远更为常见,其中服务器根据请求头(Accept-Language
、Accept
等)直接为客户端选择最合适的资源。
状态
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>
另请参阅
300 Multiple Choices
- RFC 2295
- 内容协商
- HTTP 响应状态码
- Apache HTTP Server 文档中的内容协商
- Apache httpd
mod_negotiation.c
源代码 显示触发HTTP_VARIANT_ALSO_VARIES
响应的条件。