416 Range Not Satisfiable
Uso
Cuando se recibe el mensaje de error 416 Range Not Satisfiable, el cliente ha solicitado contenido parcial mediante la cabecera Range. En los rangos de bytes, si el primer byte del rango indicado es mayor que la longitud del recurso, se devuelve este error.
Uno de los motivos para solicitar rangos parciales son las transferencias de archivos grandes, en las que el cliente quiere descargar un archivo por fragmentos. Usando la cabecera Range en la solicitud, un archivo se descarga de hecho por partes y en cualquier orden.
Cuando el servidor satisface la solicitud y devuelve al menos uno de los rangos solicitados como subconjunto del recurso, se devuelve 206 para indicar el éxito. Los servidores tienen la opción de ignorar las solicitudes de rango y devolver el recurso íntegro con el estado 200.
Como parte de la respuesta, el servidor crea una cabecera Content-Range que indica la longitud actual de los datos:
Content-Range: bytes */512
Un asterisco * antes del delimitador / indica un rango que no se puede satisfacer, seguido del tamaño total del recurso.
Impacto en SEO
Los motores de búsqueda como Google no indexarán una URL con un estado de respuesta 416. Las URL indexadas previamente se eliminarán de los resultados de búsqueda.
Ejemplo
El cliente solicita los bytes 1000 a 2000 de un recurso. El servidor devuelve 416 Range Not Satisfiable porque el archivo solo tiene 512 bytes de longitud. Con la información sobre el tamaño total devuelta por el servidor, el cliente vuelve a construir la solicitud con un rango válido.
Solicitud
GET /documents/main HTTP/1.1
Host: example.com
Range: bytes=1000-2000
Respuesta
HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */512
Respuesta alternativa cuando el servidor ignora el rango
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 512
<entire 512 bytes in message body>
Cómo solucionarlo
La cabecera Range indica un rango de bytes fuera de los límites del recurso. La causa más común es solicitar bytes más allá del final del archivo (por ejemplo, pedir los bytes 1000-2000 de un archivo que solo tiene 512 bytes).
Verifique primero el tamaño del recurso. Envíe una solicitud HEAD para leer la cabecera Content-Length antes de construir una solicitud de rango. Así se evita pedir bytes más allá del límite del archivo.
Compruebe el cálculo del rango de bytes. Los rangos de bytes se indexan desde cero e incluyen ambos extremos. Un archivo de 512 bytes tiene posiciones de byte válidas de 0 a 511. El rango bytes=0-511 solicita el archivo completo. Los errores por uno en los cálculos de rango son una fuente frecuente de respuestas 416.
Gestione los cambios del recurso. Al reanudar una descarga, el archivo del servidor puede haber cambiado o haberse eliminado desde la última solicitud parcial. Un rango válido para la versión anterior pasa a ser inválido para un archivo más corto o distinto. Vuelva a comprobar el tamaño del recurso antes de reanudar.
Elimine la cabecera Range. Cuando no se necesita contenido parcial, suprima la cabecera Range para solicitar el recurso completo. En su lugar, el servidor devuelve 200 con el cuerpo completo.
Borre la caché del navegador. Los navegadores a veces almacenan en caché respuestas parciales y construyen solicitudes de rango inválidas en visitas posteriores. Borrar la caché fuerza una nueva solicitud completa.
Consideraciones del lado del servidor. Algunas configuraciones de servidor limitan qué tipos de recursos admiten solicitudes de rango. Verifique que el servidor envía Accept-Ranges: bytes en las respuestas del recurso de destino. Cuando aparece Accept-Ranges: none, el servidor no admite en absoluto las solicitudes parciales para ese recurso.
Fallos de carga de medios
Los reproductores de vídeo y audio de los navegadores envían solicitudes de rango para transmitir archivos multimedia. Un error 416 durante la reproducción significa que el reproductor solicitó un rango de bytes más allá del límite del archivo. Esto ocurre cuando el archivo multimedia se sustituyó por una versión más corta mientras el reproductor conservaba un valor de Content-Length obsoleto. Recargar la página obliga al reproductor a obtener el tamaño actual del archivo antes de solicitar rangos.
Referencias de código
.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