406 Not Acceptable
Verwendung
Trifft ein Fehler 406 Not Acceptable ein, wurde die Antwort durch einen aushandlungsbezogenen Header wie Accept oder Accept-Language ausgelöst. Sendet der Client einen oder mehrere dieser Header, erfüllt der Server die Anforderungen, soweit dies möglich ist.
Die häufigsten HTTP-Accept-Header sind:
Accept: Gibt den bevorzugten Inhaltstyp an. Ein Server liefert entweder reinen Text oder eine HTML-Repräsentation. In diesem Beispiel bevorzugt der Client HTML, akzeptiert aber auch reinen Text.
Accept: text/html, text/plain
Accept-Encoding: Gibt die Kodierungen an, die der Client akzeptiert. In diesem Beispiel signalisiert der Client Unterstützung für gzip-Komprimierung.
Accept-Encoding: gzip
In der Praxis wird dieser Fehler selten eingesetzt, weil der Server stattdessen eine Standardrepräsentation ausliefert. Die zugrunde liegende Annahme ist, dass dem Client irgendetwas lieber ist als gar nichts. Wird die Antwort 406 Not Acceptable zurückgegeben, enthält der Nachrichtenrumpf eine Liste verfügbarer Repräsentationen, aus der der Client auswählt.
Hinweis
406 Not Acceptable bedeutet, dass der Server keine Antwort erzeugen kann, die zu den Accept-Headern des Clients passt (Problem mit dem Ausgabeformat). 415 Unsupported Media Type bedeutet, dass der Server den Content-Type des Anfragerumpfs nicht versteht (Problem mit dem Eingabeformat). Bei 406 geht es darum, was der Client empfangen möchte, bei 415 darum, was der Client gesendet hat.
SEO-Auswirkung
Suchmaschinen wie Google indexieren keine URL, die den Status 406 Not Acceptable zurückgibt. Zuvor indexierte URLs, die diesen Statuscode liefern, werden aus den Suchergebnissen entfernt.
Beispiel
Der Client fordert eine Ressource auf Französisch an, der Server antwortet jedoch mit 406 Not Acceptable, weil nur eine deutsche und eine englische Fassung verfügbar sind.
Anfrage
GET /news HTTP/1.1
Host: example.com
Accept-Language: fr
Antwort
HTTP/1.1 406 Not Acceptable
Content-Type: text/html
Content-Length: 242
<html>
<head>
<title>French Language Not Available</title>
</head>
<body>
<p>Please choose a supported language:</p>
<p><a href="/news/news-de.html">German</a></p>
<p><a href="/news/news-en.html">English</a></p>
</body>
</html>
Behebung
Ein 406 Not Acceptable bedeutet, dass der Server über keine Repräsentation verfügt, die zu den Headern der Inhaltsaushandlung des Clients passt.
Prüfen Sie den Accept-Header. Erweitern Sie die akzeptierten Medientypen. Fügen Sie beispielsweise application/json neben text/html hinzu oder verwenden Sie /, um jedes Format zu akzeptieren. Nutzen Sie die Browser-DevTools (Tab „Network“) oder curl -v, um den exakten Accept-Header zu inspizieren, den der Client sendet.
Prüfen Sie die Accept-Language-Einschränkungen. Das Anfordern einer Sprache, die der Server nicht unterstützt, löst diesen Fehler aus. Erweitern Sie die Sprachliste oder ergänzen Sie einen Platzhalter (*) als Rückfalloption. Die Spracheinstellungen des Browsers steuern diesen Header automatisch. Passen Sie sie in den Sprachpräferenzen des Browsers an.
Entfernen Sie übermäßig restriktive Accept-Encoding- oder Accept-Charset-Werte. Eine eng gefasste Kodierungs- oder Zeichensatzanforderung schränkt die Möglichkeiten des Servers ein. Lassen Sie gängige Werte wie gzip, deflate und UTF-8 zu.
Sehen Sie sich den Antwortrumpf auf verfügbare Alternativen an. Der Server listet in der 406-Antwort häufig die unterstützten Repräsentationen auf. Wählen Sie eine davon aus und passen Sie die Aushandlungs-Header entsprechend an.
Prüfen Sie die serverseitige Konfiguration der Inhaltsaushandlung. Falsch konfigurierte Type-Maps oder fehlende MIME-Typ-Registrierungen auf dem Server führen zu unerwarteten 406-Antworten. In Apache steuern mod_negotiation und MultiViews die Type-Maps. Vergewissern Sie sich, dass die AddType-Direktiven die benötigten MIME-Typen registrieren.
Prüfen Sie mod_security- oder WAF-Regeln. Apaches mod_security (und vergleichbare WAFs) fängt Anfragen ab und gibt 406 zurück, wenn eine Regel auf den Anfrageinhalt und nicht auf den Accept-Header anschlägt. Sehen Sie im Fehlerprotokoll des Servers nach einem ModSecurity-Eintrag und notieren Sie die Regel-ID (z. B. [id “941160”]). Nehmen Sie die betreffende Regel gezielt auf die Ausnahmeliste, statt die WAF vollständig zu deaktivieren:
SecRuleRemoveById 941160
Platzieren Sie die Ausnahme in der Virtual-Host-Konfiguration oder in der .htaccess-Datei.
Testen Sie mit einer minimalen Anfrage. Entfernen Sie sämtliche Aushandlungs-Header und senden Sie mit curl eine nackte Anfrage, um festzustellen, ob der Server eine Standardrepräsentation zurückgibt. Ist die nackte Anfrage erfolgreich, fügen Sie die Aushandlungs-Header einzeln wieder hinzu, um den Header zu isolieren, der die Ablehnung auslöst.
Überprüfen Sie die API-Versionsaushandlung. Manche APIs nutzen den Accept-Header zur Versionierung (z. B. application/vnd.api.v2+json). Das Senden einer nicht unterstützten Versionszeichenkette erzeugt 406. Gleichen Sie den Versionswert mit der API-Dokumentation ab.
Code-Referenzen
.NET
HttpStatusCode.NotAcceptable
Rust
http::StatusCode::NOT_ACCEPTABLE
Rails
:not_acceptable
Go
http.StatusNotAcceptable
Symfony
Response::HTTP_NOT_ACCEPTABLE
Python3.5+
http.HTTPStatus.NOT_ACCEPTABLE
Java
java.net.HttpURLConnection.HTTP_NOT_ACCEPTABLE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_NOT_ACCEPTABLE
Angular
@angular/common/http/HttpStatusCode.NotAcceptable