506 Variant Also Negotiates
用法
506 Variant Also Negotiates 状态码出现在透明内容协商(Transparent Content Negotiation)期间,在有多个变体可用时,该协议会为客户端选择目标资源的最佳变体。
变体是目标资源的不同版本。例如,一个以多种语言提供的资源,每种语言都有一个对应的变体。当发起 GET 或 HEAD 请求时,透明内容协商会自动选择最佳变体。
506 错误意味着被选中的变体本身也被配置为进行协商,从而形成一个服务器会终止的循环。
注意
该协议在 1998 年被描述为实验性的,并未被正式采纳为标准。
SEO 影响
搜索引擎对 506 的处理与其他 5xx 服务器错误相同。持续的失败会降低抓取速率,并最终将受影响的 URL 从索引中移除。
示例
客户端发送带有 Accept 头的 GET 请求。服务器尝试进行内容协商,但发现所选变体也引用了协商,导致循环配置错误。
请求
GET /docs HTTP/1.1
Host: example.com
Accept: text/html, application/xhtml+xml
响应
HTTP/1.1 506 Variant Also Negotiates
Content-Type: text/html; charset=UTF-8
Content-Length: 191
<html>
<head>
<title>Variant Also Negotiates</title>
</head>
<body>
<p>Content negotiation for the requested
resource resulted in a circular reference.</p>
</body>
</html>
如何修复
服务器的内容协商设置存在循环引用:某个被选中的变体本身又被配置为继续协商。通过确保每个变体都指向一个具体的表现形式来打破循环。
Apache 特定的修复:
通用修复:
此状态码属于实验性质,在生产环境中极为罕见。大多数现代应用在应用层处理内容协商,从而完全避免了服务器级别的透明协商机制。
代码参考
.NET
HttpStatusCode.VariantAlsoNegotiates
Rust
http::StatusCode::VARIANT_ALSO_NEGOTIATES
Rails
:variant_also_negotiates
Go
http.StatusVariantAlsoNegotiates
Symfony
Response::HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL
Python3.5+
http.HTTPStatus.VARIANT_ALSO_NEGOTIATES
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_VARIANT_ALSO_NEGOTIATES
Angular
@angular/common/http/HttpStatusCode.VariantAlsoNegotiates