HTTPQUERY
Deutsch

416 Range Not Satisfiable

Verwendung

Wenn die Fehlermeldung 416 Range Not Satisfiable empfangen wird, hat der Client mit dem Range-Header einen Teil des Inhalts angefordert. Bei Byte-Bereichen wird dieser Fehler zurückgegeben, wenn das erste Byte des angegebenen Bereichs größer ist als die Länge der Ressource.

Einer der Gründe für die Anforderung von Teilbereichen sind große Dateiübertragungen, bei denen der Client eine Datei in Blöcken herunterladen möchte. Mit dem Range-Header in der Anfrage lässt sich eine Datei effektiv in Teilstücken und in beliebiger Reihenfolge herunterladen.

Erfüllt der Server die Anfrage und liefert mindestens einen der angeforderten Bereiche als Teilmenge der Ressource zurück, wird 206 als Erfolgsmeldung zurückgegeben. Server können Range-Anfragen auch ignorieren und die Ressource vollständig mit dem Status 200 zurückgeben.

Als Teil der Antwort erzeugt der Server einen Content-Range-Header, der die aktuelle Länge der Daten angibt:

Content-Range: bytes */512

Ein Sternchen * vor dem Trennzeichen / kennzeichnet einen nicht erfüllbaren Bereich, gefolgt von der Gesamtgröße der Ressource.

SEO-Auswirkung

Suchmaschinen wie Google indexieren keine URL mit dem Antwortstatus 416. Zuvor indexierte URLs werden aus den Suchergebnissen entfernt.

Beispiel

Der Client fordert die Bytes 1000 bis 2000 einer Ressource an. Der Server gibt 416 Range Not Satisfiable zurück, weil die Datei nur 512 Byte lang ist. Mithilfe der vom Server zurückgegebenen Information über die Gesamtgröße stellt der Client die Anfrage mit einem gültigen Bereich erneut.

Anfrage

GET /documents/main HTTP/1.1
Host: example.com
Range: bytes=1000-2000

Antwort

HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */512

Alternative Antwort, wenn der Server den Bereich ignoriert

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 512

<entire 512 bytes in message body>

Behebung

Der Range-Header gibt einen Byte-Bereich außerhalb der Ressourcengrenzen an. Die häufigste Ursache ist die Anforderung von Bytes über das Dateiende hinaus (zum Beispiel die Anforderung der Bytes 1000-2000 aus einer Datei von nur 512 Byte Länge).

Prüfen Sie zuerst die Ressourcengröße. Senden Sie eine HEAD-Anfrage, um den Content-Length-Header zu lesen, bevor Sie eine Range-Anfrage konstruieren. Dadurch wird vermieden, Bytes jenseits der Dateigrenze anzufordern.

Prüfen Sie die Berechnung des Byte-Bereichs. Byte-Bereiche sind nullbasiert indexiert und an beiden Enden inklusiv. Eine 512 Byte große Datei hat die gültigen Byte-Positionen 0 bis 511. Der Bereich bytes=0-511 fordert die gesamte Datei an. Off-by-one-Fehler in Bereichsberechnungen sind eine häufige Quelle für 416-Antworten.

Berücksichtigen Sie Änderungen an der Ressource. Beim Fortsetzen eines Downloads kann sich die Datei auf dem Server seit der letzten Teilanfrage geändert haben oder gelöscht worden sein. Ein für die vorherige Version gültiger Bereich wird für eine kürzere oder andere Datei ungültig. Prüfen Sie die Ressourcengröße vor dem Fortsetzen erneut.

Entfernen Sie den Range-Header. Wenn kein Teilinhalt benötigt wird, lassen Sie den Range-Header weg, um die vollständige Ressource anzufordern. Der Server gibt stattdessen 200 mit dem vollständigen Body zurück.

Leeren Sie den Browser-Cache. Browser cachen mitunter Teilantworten und konstruieren bei späteren Besuchen ungültige Range-Anfragen. Das Leeren des Caches erzwingt eine komplett neue vollständige Anfrage.

Serverseitige Überlegungen. Manche Serverkonfigurationen schränken ein, welche Ressourcentypen Range-Anfragen unterstützen. Prüfen Sie, ob der Server in den Antworten für die Zielressource Accept-Ranges: bytes sendet. Ist Accept-Ranges: none vorhanden, unterstützt der Server Teilanfragen für diese Ressource überhaupt nicht.

Fehler beim Laden von Medien

Video- und Audioplayer in Browsern senden Range-Anfragen, um Mediendateien zu streamen. Ein 416-Fehler während der Wiedergabe bedeutet, dass der Player einen Byte-Bereich jenseits der Dateigrenze angefordert hat. Das passiert, wenn die Mediendatei durch eine kürzere Version ersetzt wurde, während der Player noch einen veralteten Content-Length-Wert hielt. Ein Neuladen der Seite zwingt den Player dazu, die aktuelle Dateigröße abzurufen, bevor er Bereiche anfordert.

Code-Referenzen

.NET

HttpStatusCode.RequestedRangeNotSatisfiable

Rust

http::StatusCode::RANGE_NOT_SATISFIABLE

Rails

:range_not_satisfiable
:requested_range_not_satisfiable

Go

http.StatusRequestedRangeNotSatisfiable

Symfony

Response::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE

Python3.5+

http.HTTPStatus.REQUESTED_RANGE_NOT_SATISFIABLE

Java

HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE

Angular

@angular/common/http/HttpStatusCode.RangeNotSatisfiable