Я пытаюсь реализовать поддержку Content-Range в файлах, созданных PHP. Когда браузер отправляет запрос диапазона, мой скрипт дает правильные байты, и он работает хорошо. Но во время тестирования того, как выглядит Content-Range при загрузке PDF-файла с сервера Apache, я понял, что первый запрос от веб-браузера к моему серверу не содержит заголовка Range, но каким-то образом сервер по-прежнему не возвращает полный файл, а только 32 КБ.
На этом снимке экрана вы можете видеть, что Firefox отправляет 5 запросов к Apache для my_pdf.pdf, а Apache каждый раз отвечает 32-192 КБ. Весь PDF-файл составляет 28 МБ. Запросы 2–5 действительно содержат запрос диапазона. Но первая просьба - не выделена. Вы можете видеть справа, что Content-Length составляет 28 МБ, но Apache вернул только 32 КБ.
Итак, у меня вопрос: как Apache узнал, что должен возвращать только 32 КБ, а не весь PDF-файл размером 28 МБ?






So my question is- how did Apache know to return only 32 kB and not the whole 28 MB PDF file?
Это не так. Если вы посмотрите на заголовок Content-Length в ответе, он показывает полный размер файла 29,3 миллиона байтов.
Вероятно, клиент закрыл соединение, не прочитав весь ответ.
Ответ, отправленный @duskwuff, верен - Firefox прекращает передачу первых запросов, когда его достаточно для обработки PDF.
Ниже приведены лишь некоторые детали, которые я обнаружил. Firefox завершит свою работу, если ваши скрипты вернут следующие заголовки:
Accept-Ranges: bytes
Content-Length: 29293315
Вы также можете (но не обязаны) вернуть этот заголовок:
header("Content-Range: bytes 0-29293314/29293315");
Однако по умолчанию Apache пытается сжать все, что возвращает PHP, а затем добавляет этот заголовок:
Transfer-Encoding: chunked
И когда Firefox (и Chrome) увидят это, они не закроют соединение. Поэтому я просто отключил сжатие Apache, и все работает. Теперь Firefox просто выполняет несколько запросов, получает фрагменты PDF вместо всего файла и отлично отображает первую страницу (потому что ему не нужен был весь PDF-файл для отображения только первой страницы).