Функция PHP header (), генерирующая ошибку ERR_INVALID_RESPONSE при загрузке некоторых файлов - PullRequest
0 голосов
/ 07 июля 2019

У меня есть сайт PHP, который обслуживает загрузки MP3. Сценарий работает нормально с тех пор, как я запустил сайт в январе, но сегодня утром я получил сообщение об ошибке от пользователя. Я поднял копию полученного е-мейла, и ссылки для скачивания в письме сгенерировали эту ошибку:

Этот сайт недоступен Веб-страница по адресу https://www.thefump.com/downloads/order-download-song/2475/m94WxtgV%2BxFE1IZS%2Fkd7VQ%3D%3D может быть временно недоступна или постоянно перемещена на новый веб-адрес.

ERR_INVALID_RESPONSE

Я взглянул на код и обнаружил, что первые 3 вызова header () генерировали ошибку.

header('Content-Type: application/octet-stream');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($file));

(Весь фрагмент кода ниже.)

Если я закомментирую эти строки, MP3 загружается непосредственно в окно браузера в виде двоичных данных, поэтому я знаю, что путь к файлу правильный.

Вот полный код загрузки. Первые три вызова заголовка по какой-то причине генерируют ошибку. Остальные не имеют значения. Изначально у меня был запущен ob_clean, но во время тестов он закомментировал его, потому что другой аналогичный скрипт на работающем сайте закомментировал его.

$file = "<path to file, verified correct>";

header('Content-Type: application/octet-stream');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . remoteFileSize($file));

// ob_clean();
flush();
readfile($file);
exit;

Во время моего исследования я обнаружил заказ, который этот же клиент разместил в прошлом месяце. Все эти ссылки для скачивания работают нормально, и они имеют доступ к одному и тому же сценарию. Они просто указывают на разные песни. (Это было, когда я исследовал пути к файлам и любые другие различия между файлами на сервере.)

Но я заметил еще одно отличие. Сценарий, который не работает, показывает значок блокировки в браузере, указывающий на его безопасность. Тот, который работает, показывает значок «i» в кружке вместо замка, несмотря на то, что это тот же сценарий на том же сервере, который обслуживается по протоколу HTTPS. Когда я нажимаю «i», появляется обычное «ваше соединение с этим сайтом небезопасно».

Что может быть причиной безопасного обслуживания сценария в одном случае, а не безопасного - в другом? И что мне нужно сделать, чтобы эти вызовы заголовков работали на защищенной странице?

...