Apache и Content-Range

Я пытаюсь реализовать поддержку 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 МБ?

Apache и Content-Range

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
2 860
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Другие вопросы по теме