Como sugirió Wrikken , es una solicitud válida. También es bastante común cuando el cliente solicita medios o reanuda una descarga.
Un cliente a menudo probará para ver si el servidor maneja solicitudes de rango, además de buscar una Accept-Ranges
respuesta. Chrome siempre envía un Range: bytes=0-
mensaje con su primera solicitud GET para un video, por lo que es algo que no puedes descartar.
Siempre que un cliente incluye Range:
en su solicitud, incluso si tiene un formato incorrecto, espera una respuesta de contenido parcial (206). Cuando busca hacia adelante durante la reproducción de video HTML5, el navegador solo solicita el punto de partida. Por ejemplo:
Range: bytes=3744-
Por lo tanto, para que el cliente reproduzca el video correctamente, su servidor debe poder manejar estas solicitudes de rango incompletas.
Puede manejar el tipo de 'rango' que especificó en su pregunta de dos maneras:
Primero, puede responder con el punto de partida solicitado que se indica en la respuesta, luego la longitud total del archivo menos uno (el rango de bytes solicitado tiene un índice cero). Por ejemplo:
Solicitud:
GET /BigBuckBunny_320x180.mp4
Range: bytes=100-
Respuesta:
206 Partial Content
Content-Type: video/mp4
Content-Length: 64656927
Accept-Ranges: bytes
Content-Range: bytes 100-64656926/64656927
En segundo lugar, puede responder con el punto de partida que se indica en la solicitud y una longitud de archivo abierta (tamaño). Esto es para webcasts u otros medios donde se desconoce la duración total. Por ejemplo:
Solicitud:
GET /BigBuckBunny_320x180.mp4
Range: bytes=100-
Respuesta:
206 Partial Content
Content-Type: video/mp4
Content-Length: 64656927
Accept-Ranges: bytes
Content-Range: bytes 100-64656926/*
Consejos:
Siempre debe responder con la longitud del contenido incluida en el rango. Si el rango está completo, de principio a fin, entonces la longitud del contenido es simplemente la diferencia:
Solicitud: Rango: bytes = 500-1000
Respuesta: Rango de contenido: bytes 500-1000 / 123456
Recuerde que el rango tiene un índice cero, por Range: bytes=0-999
lo que en realidad está solicitando 1000 bytes, no 999, así que responda con algo como:
Content-Length: 1000
Content-Range: bytes 0-999/123456
O:
Content-Length: 1000
Content-Range: bytes 0-999/*
Pero evite el último método si es posible porque algunos reproductores multimedia intentan calcular la duración a partir del tamaño del archivo. Si su solicitud es de contenido multimedia, que es mi corazonada, entonces debe incluir su duración en la respuesta. Esto se hace con el siguiente formato:
X-Content-Duration: 63.23
Debe ser un punto flotante. A diferencia Content-Length
, este valor no tiene por qué ser exacto. Se usa para ayudar al jugador a buscar en el video. Si está transmitiendo un webcast y solo tiene una idea general de cuánto tiempo durará, es mejor incluir su duración estimada en lugar de ignorarla por completo. Entonces, para un webcast de dos horas, podría incluir algo como:
X-Content-Duration: 7200.00
Con algunos tipos de medios, como webm, también debe incluir el tipo de contenido, como:
Content-Type: video/webm
Todos estos son necesarios para que los medios se reproduzcan correctamente, especialmente en HTML5. Si no da una duración, el jugador puede intentar averiguar la duración (para permitir la búsqueda) a partir del tamaño de su archivo, pero esto no será exacto. Esto está bien y es necesario para transmisiones por Internet o transmisión en vivo, pero no es ideal para la reproducción de archivos de video. Puede extraer la duración utilizando un software como FFMPEG y guardarlo en una base de datos o incluso el nombre del archivo.
X-Content-Duration
se está eliminando gradualmente a favor de Content-Duration
, por lo que también lo incluiría. Una respuesta básica a una solicitud "0-" incluiría al menos lo siguiente:
HTTP/1.1 206 Partial Content
Date: Sun, 08 May 2013 06:37:54 GMT
Server: Apache/2.0.52 (Red Hat)
Accept-Ranges: bytes
Content-Length: 3980
Content-Range: bytes 0-3979/3980
Content-Type: video/webm
X-Content-Duration: 2054.53
Content-Duration: 2054.53
Un punto más: Chrome siempre comienza su primera solicitud de video con lo siguiente:
Range: bytes=0-
Algunos servidores enviarán una respuesta 200 regular como respuesta, que acepta (pero con opciones de reproducción limitadas), pero intente enviar un 206 en su lugar para mostrar que su servidor maneja los rangos. RFC 2616 dice que es aceptable ignorar los encabezados de rango.