HTTPQUERY
Русский

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