HTTPQUERY
日本語

506 Variant Also Negotiates

使い方

506 Variant Also Negotiates ステータスコードは、透過的コンテントネゴシエーションの最中に発生します。これは、ターゲットリソースの複数のバリアントが利用可能な場合に、プロトコルがクライアントにとって最適なバリアントを選択する仕組みです。

バリアントとは、対象リソースの異なるバージョンのことです。たとえば、複数の言語で利用可能なリソースには、言語ごとのバリアントがあります。透過的コンテントネゴシエーションは、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