Range header
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Der HTTP-Range-Request-Header gibt den Teil einer Ressource an, den der Server zurückgeben soll.
Mehrere Teile können gleichzeitig in einem Range-Header angefordert werden, und der Server kann diese Bereiche in einem Multipart-Dokument zurücksenden.
Wenn der Server Bereiche zurücksendet, verwendet er für die Antwort den Statuscode 206 Partial Content.
Wenn die Bereiche ungültig sind, gibt der Server den Fehler 416 Range Not Satisfiable zurück.
Ein Server, der Range-Anfragen nicht unterstützt, kann den Range-Header ignorieren und die gesamte Ressource mit einem Statuscode 200 zurückgeben.
Ältere Browser verwendeten einen Response-Header von Accept-Ranges: none, um Funktionen wie „Pausieren“ oder „Fortsetzen“ in Download-Managern zu deaktivieren. Da ein Server, der den Range-Header ignoriert, jedoch dieselbe Bedeutung hat wie eine Antwort mit Accept-Ranges: none, wird der Header auf diese Weise nur selten verwendet.
Derzeit sind nur bytes-Einheiten registriert, bei denen es sich um Offsets (nullbasiert und einschließlich) handelt.
Wenn auf die angeforderten Daten eine Content-Codierung angewendet wurde, stellt jeder Byte-Bereich die kodierte Byte-Sequenz dar, nicht die Bytes, die nach dem Dekodieren erhalten würden.
Der Header ist ein CORS-safelisted Request-Header, wenn die Direktive einen einzelnen Byte-Bereich angibt.
| Header-Typ | Request-Header |
|---|---|
| Verbotener Request-Header | Nein |
Syntax
Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, …, <range-startN>-<range-endN>
Range: <unit>=-<suffix-length>
Direktiven
<unit>-
Die Einheit, in der Bereiche definiert werden. Derzeit ist nur
byteseine registrierte Einheit. <range-start>-
Eine Ganzzahl in der angegebenen Einheit, die die Startposition des angeforderten Bereichs angibt.
<range-end>-
Eine Ganzzahl in der angegebenen Einheit, die die Endposition des angeforderten Bereichs angibt. Dieser Wert ist optional. Wenn er weggelassen wird, wird das Ende der Ressource als Ende des Bereichs verwendet.
<suffix-length>-
Eine Ganzzahl, die die Anzahl der Einheiten am Ende der Ressource angibt, die zurückgegeben werden sollen.
Beispiele
Die folgenden Beispiele zeigen, wie Anfragen mit dem Range-Header für CORS-safelisted Anfragen und zum Anfordern mehrerer Bereiche gestellt werden.
Weitere Beispiele finden Sie im Leitfaden zu HTTP-Range-Anfragen.
Einzelne Byte-Bereiche und CORS-safelisted Anfragen
Der Range-Header ist ein CORS-safelisted Request-Header, wenn der Wert ein einzelner Byte-Bereich ist.
Das bedeutet, dass er in Cross-Origin-Anfragen verwendet werden kann, ohne eine Preflight-Anfrage auszulösen. Dies ist für das Anfordern von Medien und das Fortsetzen von Downloads nützlich.
Das folgende Beispiel fordert die ersten 500 Bytes einer Ressource an:
Range: bytes=0-499
Um die zweiten 500 Bytes anzufordern:
Range: bytes=500-999
Durch Weglassen der Endposition werden alle verbleibenden Einheiten der Ressource angefordert. Daher können die letzten 100 Bytes einer Ressource mit einer Länge von 1000 Bytes folgendermaßen angefordert werden:
Range: bytes=900-
Alternativ können, wenn die Größe einer Ressource unbekannt ist, die letzten n Bytes mithilfe eines Suffix-Bereichs von -n angefordert werden:
Range: bytes=-100
Mehrere Bereiche anfordern
Bei einer Ressource mit einer Länge von 10000 Bytes fordert das folgende Beispiel drei separate Bereiche an: 200-999 (800 Bytes), 2000-2499 (500 Bytes) und schließlich 9500-.
Der Bereichsspezifiziererwert 9500- lässt eine Endposition weg. Dies gibt an, dass alle Bytes ab 9500 Teil des dritten Bereichs sind (500 Bytes).
Range: bytes=200-999, 2000-2499, 9500-
Dieses Beispiel fordert die ersten 500 und die letzten 500 Bytes der Datei an. Die Anfrage kann vom Server abgelehnt werden, wenn sich diese Bereiche überschneiden (wenn die angeforderte Ressource beispielsweise kürzer als 1000 Bytes war).
Range: bytes=0-499, -500
Überprüfen, ob ein Server Range-Anfragen unterstützt
Der folgende curl-Befehl führt für ein Bild eine HEAD-Anfrage aus:
curl -v --http1.1 -I https://i.imgur.com/z4d4kWk.jpg
# or using the OPTIONS method:
# curl -v --http1.1 -X OPTIONS https://i.imgur.com/z4d4kWk.jpg
Dies führt zu folgender HTTP-Anfrage:
HEAD /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
User-Agent: curl/8.7.1
Accept: */*
Der Server antwortet mit einer 200-Antwort, und der Header Accept-Ranges: bytes ist vorhanden (einige Header wurden der Kürze halber weggelassen):
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 146515
Content-Type: image/jpeg
…
Accept-Ranges: bytes
Einen Bereich von einer Blob-URL abrufen
Die blob:-URL unterstützt ebenfalls Range-Anfragen durch Verwendung von fetch().
const blob = new Blob(["Hello, world!"], { type: "text/plain" });
const url = URL.createObjectURL(blob);
fetch(url, {
headers: {
Range: "bytes=7-11",
},
})
.then((response) => response.text())
.then((text) => console.log(text)); // "world"
Spezifikationen
| Spezifikation |
|---|
| HTTP Semantics> # field.range> |
Browser-Kompatibilität
Siehe auch
- Bedingter Request-Header
If-Range - Response-Header
Content-Range Content-TypeAccept-Ranges206 Partial Content416 Range Not Satisfiable- Leitfaden zu HTTP-Range-Anfragen
- CORS-safelisted Request-Header