Есть ли способ правильно разбирать заголовок HTTP_RANGE
в PHP? Думал, что я попрошу здесь, прежде чем изобретать колесо.
В настоящее время я использую
preg_match('/bytes=(\d+)-(\d+)/', $_SERVER['HTTP_RANGE'], $matches);
для анализа заголовка, но это не охватывает все возможные значения заголовка, поэтому мне интересно, есть ли функция или библиотека, которые могут это сделать уже?
Заранее спасибо.
Скорее используйте регулярное выражение, чтобы проверить его перед отправкой 416
. Затем просто проанализируйте его, взорвав запятую ,
и дефис. Я также вижу, что вы использовали \d+
в своем регулярном выражении, но на самом деле этого не требуется. Когда один из индексов диапазона опущен, то это просто означает «первый байт» или «последний байт». Вы должны покрыть это и в своем регулярном выражении. Также см. Заголовок Range в спецификации 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
Взято из пакета PEAR HTTP_Download :
function getRanges() { return preg_match('/^bytes=((\d*-\d*,? ?)+)$/', @$_SERVER['HTTP_RANGE'], $matches) ? $matches[1] : array(); }
Также неплохо использовать эти пакеты для таких вещей!
Существует фрагмент, реализующий поддержку диапазона HTTP на странице fread()
: