506 Variant Also Negotiates
Применение
Код состояния 506 Variant Also Negotiates возникает при прозрачном согласовании содержимого (Transparent Content Negotiation), когда протокол выбирает для клиента наилучший вариант целевого ресурса из нескольких доступных.
Варианты — это разные версии рассматриваемого ресурса. Например, у ресурса, доступного на нескольких языках, есть вариант для каждого из них. Прозрачное согласование содержимого автоматически выбирает наилучший вариант при выполнении запроса GET или HEAD.
Ошибка 506 означает, что выбранный вариант сам настроен на согласование, что приводит к циклу, который сервер прерывает.
Примечание
Этот протокол был описан как экспериментальный в 1998 году и официально не принят в качестве стандарта.
Влияние на SEO
Поисковые системы обрабатывают 506 так же, как и другие серверные ошибки 5xx. Устойчивые сбои снижают скорость сканирования и в конечном итоге приводят к удалению затронутых URL из индекса.
Пример
Клиент отправляет GET-запрос с заголовком Accept. Сервер пытается выполнить согласование содержимого, но обнаруживает, что выбранный вариант тоже ссылается на согласование, что приводит к ошибке циклической конфигурации.
Запрос
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