Verwenden Sie lieber Regex, um es zu testen, bevor Sie einen 416
senden. Dann einfach nur durch Aufteilen am Komma ,
und am Bindestrich -
analysieren. Ich sehe auch, dass Sie \d+
in Ihrem Regex verwendet haben, aber diese sind tatsächlich nicht erforderlich. Wenn eines der Bereichsindizes ausgelassen wird, bedeutet das einfach "erstes Byte" oder "letztes Byte". Sie sollten das auch in Ihrem Regex abdecken. Sehen Sie sich auch den Bereichsheader in der HTTP-Spezifikation an, wie Sie damit umgehen sollen.
Startbeispiel:
if (isset($_SERVER['HTTP_RANGE'])) {
if (!preg_match('^bytes=\d*-\d*(,\d*-\d*)*$', $_SERVER['HTTP_RANGE'])) {
header('HTTP/1.1 416 Angeforderter Bereich nicht zufriedenstellend');
header('Content-Range: Bytes */' . filelength); // Erforderlich in 416.
exit;
}
$ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6));
foreach ($ranges as $range) {
$parts = explode('-', $range);
$start = $parts[0]; // Wenn dies leer ist, sollte dies 0 sein.
$end = $parts[1]; // Wenn dies leer ist oder größer als filelength - 1 ist, sollte dies filelength - 1 sein.
if ($start > $end) {
header('HTTP/1.1 416 Angeforderter Bereich nicht zufriedenstellend');
header('Content-Range: Bytes */' . filelength); // Erforderlich in 416.
exit;
}
// ...
}
}
Bearbeitung: $start muss immer kleiner sein als $end