HTTPQUERY
English

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