HTTPQUERY
Français

416 Range Not Satisfiable

Utilisation

Lorsque le message d’erreur 416 Range Not Satisfiable est reçu, le client a demandé un contenu partiel à l’aide de l’en-tête Range. Pour les plages d’octets, si le premier octet de la plage indiquée est supérieur à la longueur de la ressource, cette erreur est renvoyée.

L’une des raisons pour lesquelles des plages partielles sont demandées est le transfert de fichiers volumineux, lorsque le client souhaite télécharger un fichier par morceaux. En utilisant l’en-tête Range dans la requête, un fichier est effectivement téléchargé en plusieurs parties et dans n’importe quel ordre.

Lorsque le serveur satisfait la requête et renvoie au moins une des plages demandées en tant que sous-ensemble de la ressource, un 206 est renvoyé pour indiquer le succès. Les serveurs ont la possibilité d’ignorer les requêtes par plage et de renvoyer la ressource dans son intégralité avec le statut 200.

Dans la réponse, le serveur crée un en-tête Content-Range indiquant la longueur actuelle des données :

Content-Range: bytes */512

Un astérisque * placé avant le délimiteur / signale une plage impossible à satisfaire, suivi de la taille totale de la ressource.

Impact SEO

Les moteurs de recherche comme Google n’indexent pas une URL dont le statut de réponse est 416. Les URL précédemment indexées sont retirées des résultats de recherche.

Exemple

Le client demande les octets 1000 à 2000 d’une ressource. Le serveur renvoie 416 Range Not Satisfiable car le fichier ne fait que 512 octets. À partir de l’information sur la taille totale renvoyée par le serveur, le client reconstruit la requête avec une plage valide.

Requête

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

Réponse

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

Réponse alternative lorsque le serveur ignore la plage

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

<entire 512 bytes in message body>

Comment corriger

L’en-tête Range indique une plage d’octets située hors des limites de la ressource. La cause la plus fréquente est de demander des octets au-delà de la fin du fichier (par exemple, demander les octets 1000-2000 d’un fichier qui ne fait que 512 octets).

Vérifiez d’abord la taille de la ressource. Envoyez une requête HEAD pour lire l’en-tête Content-Length avant de construire une requête par plage. Cela évite de demander des octets au-delà de la limite du fichier.

Vérifiez le calcul des plages d’octets. Les plages d’octets sont indexées à partir de zéro et incluent leurs deux bornes. Un fichier de 512 octets a des positions d’octets valides de 0 à 511. La plage bytes=0-511 demande le fichier entier. Les erreurs de décalage d’une unité dans le calcul des plages sont une source fréquente de réponses 416.

Gérez les changements de ressource. Lors de la reprise d’un téléchargement, le fichier sur le serveur a pu être modifié ou supprimé depuis la dernière requête partielle. Une plage valide pour la version précédente devient invalide pour un fichier plus court ou différent. Revérifiez la taille de la ressource avant de reprendre.

Supprimez l’en-tête Range. Lorsque le contenu partiel n’est pas nécessaire, retirez l’en-tête Range pour demander la ressource complète. Le serveur renvoie alors un 200 avec le corps complet.

Videz le cache du navigateur. Les navigateurs mettent parfois en cache des réponses partielles et construisent des requêtes par plage invalides lors des visites suivantes. Vider le cache force une nouvelle requête complète.

Considérations côté serveur. Certaines configurations de serveur limitent les types de ressources qui prennent en charge les requêtes par plage. Vérifiez que le serveur envoie Accept-Ranges: bytes dans les réponses relatives à la ressource visée. Lorsque Accept-Ranges: none est présent, le serveur ne prend pas du tout en charge les requêtes partielles pour cette ressource.

Échecs de chargement des médias

Les lecteurs vidéo et audio des navigateurs envoient des requêtes par plage pour diffuser les fichiers multimédias. Une erreur 416 pendant la lecture signifie que le lecteur a demandé une plage d’octets au-delà de la limite du fichier. Cela se produit lorsque le fichier multimédia a été remplacé par une version plus courte alors que le lecteur conservait une valeur Content-Length obsolète. Recharger la page force le lecteur à récupérer la taille actuelle du fichier avant de demander des plages.

Références de code

.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