HTTPQUERY
Deutsch

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