Thay sử dụng regex để kiểm tra nó trước khi gửi một 416
. Sau đó, chỉ cần phân tích cú pháp bằng cách phát trên dấu phẩy ,
và dấu gạch nối -
. Tôi cũng thấy rằng bạn đã sử dụng \d+
trong regex của mình, nhưng thực tế là số không phải là. Khi một trong các chỉ mục phạm vi bị bỏ qua, thì nó chỉ có nghĩa là "byte đầu tiên" hoặc "byte cuối cùng". Bạn nên bao gồm điều đó trong regex của bạn là tốt. Xem thêm Range header in the HTTP spec cách bạn phải xử lý.
Kickoff dụ:
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;
}
// ...
}
}
Edit: $ bắt đầu phải luôn luôn ít hơn $ cuối
Tôi không biết cách nào để làm điều này, nhưng tôi sẽ có một vết nứt với biểu thức thông thường. Hãy xem các đặc điểm kỹ thuật http://tools.ietf.org/html/draft-ietf-http-range-retrieval-00 –