Ответ 1
Скорее используйте regex для test перед отправкой 416
. Затем просто проанализируйте его, взорваясь на запятой ,
и дефисом -
. Я также вижу, что вы использовали \d+
в своем регулярном выражении, но на самом деле это не. Когда один из индексов диапазона опущен, то это просто означает "первый байт" или "последний байт". Вы должны покрыть это и в своем регулярном выражении. Также см. Заголовок диапазона в спецификации HTTP, как вы должны его обрабатывать.
Пример Kickoff:
if (isset($_SERVER['HTTP_RANGE'])) {
if (!preg_match('^bytes=\d*-\d*(,\d*-\d*)*$', $_SERVER['HTTP_RANGE'])) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header('Content-Range: bytes */' . filelength); // Required in 416.
exit;
}
$ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6));
foreach ($ranges as $range) {
$parts = explode('-', $range);
$start = $parts[0]; // If this is empty, this should be 0.
$end = $parts[1]; // If this is empty or greater than than filelength - 1, this should be filelength - 1.
if ($start > $end) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header('Content-Range: bytes */' . filelength); // Required in 416.
exit;
}
// ...
}
}
Изменить: $start всегда должен быть меньше $end