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