506 Variant Also Negotiates
The HTTP 506 Variant Also Negotiates
server error response status code is returned during Transparent Content Negotiation (TCN) when there is recursive loop in the process of selecting a resource.
Transparent Content Negotiation enables a client and server to collaboratively decide the best variant of a given resource when the server has multiple variants.
A server sends a 506
status code due to server misconfiguration that results in circular references when creating responses.
Transparent Content Negotiation is not supported in most modern browsers due to complexity in implementations, lack of standardization of how clients automatically choose from responses, and the additional round-trips that slow down client-server interaction.
Server-driven content negotiation is far more common, where a server directly chooses the most appropriate resource for the client based on the request headers (Accept-Language
, Accept
, etc.).
Status
506 Variant Also Negotiates
Specifications
Specification |
---|
RFC 2295 # section-8.1 |
Examples
Resource with variants
In the following example, a client requests a page in the fr
locale using the Accept-Language
header.
This can be performed using curl:
curl -H "Negotiate: trans" -H "Accept-Language: fr;" http://example.com/index
This produces the following request:
GET /index HTTP/1.1
Host: example.com
User-Agent: curl/8.7.1
Accept: */*
Negotiate: trans
Accept-Language: fr
Due to server misconfiguration, the variant response for fr
points to a type map which itself causes transparent negotiation to be performed.
The server may detect this condition by the presence of a TCN
header in a choice response before it is sent:
HTTP/1.1 506 Variant Also Negotiates
Date: Mon, 22 Jul 2024 10:00:00 GMT
Server: Apache/2.4.41 (Unix)
Content-Type: text/html; charset=UTF-8
Content-Length: 233
TCN: list
Vary: negotiate,accept-language
Alternates: {"index.html.en" 1 {type text/html} {language en} {length 48}}, {"another-map.html.fr.map" 1 {type text/html} {language fr} {length 45}}}}
<html>
<head>
<title>506 Variant Also Negotiates</title>
</head>
<body>
<h1>Variant Also Negotiates</h1>
<p>A variant for the requested resource is itself a negotiable resource. This indicates a configuration error.</p>
</body>
</html>
See also
300 Multiple Choices
- RFC 2295
- Content negotiation
- HTTP response status codes
- Content Negotiation in Apache HTTP Server documentation
- Apache httpd
mod_negotiation.c
source showing conditions that triggerHTTP_VARIANT_ALSO_VARIES
response.