Apache и Content-Range - PullRequest
       40

Apache и Content-Range

0 голосов
/ 21 ноября 2018

Я пытаюсь реализовать поддержку Content-Range в сгенерированных PHP файлах.Когда браузер отправляет запрос Range, мой скрипт выдает правильные байты, и он работает хорошо.Но во время тестирования того, как выглядит Content-Range при загрузке PDF-файла с сервера Apache, я понял, что первый запрос из веб-браузера на мой сервер не содержит заголовок Range, но сервер все равно не возвращает полный файл и только 32 КБ.

На этом снимке экрана видно, что Firefox отправляет 5 запросов в Apache для my_pdf.pdf, а Apache каждый раз отвечает 32-192 кБ.Весь PDF составляет 28 МБ.Запросы 2-5 содержат запрос Range.Но первый запрос - выделен не так.Справа видно, что Content-Length составляет 28 МБ, но Apache возвратил только 32 КБ.

Итак, мой вопрос: как Apache узнал, что возвращает только 32 КБ, а не весь файл PDF размером 28 МБ?

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Ответ, отправленный @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 для отображения только первой страницы).

0 голосов
/ 21 ноября 2018

Итак, мой вопрос: как Apache узнал, что возвращает только 32 КБ, а не весь 28 МБ PDF-файл?

Это не так.Если вы посмотрите на заголовок Content-Length в ответе, он показывает полный размер файла 29,3 миллиона байт.

Клиент, вероятно, закрыл соединение, не прочитав весь ответ.

...