Несоответствие длины PHP контента с пользовательским скриптом доставки контента
Добрый день всем,
При разработке сайта хобби я столкнулся со следующей проблемой. Чтобы предотвратить несанкционированный доступ пользователей к файлам изображений на сервере, я установил папку, содержащую изображения, чтобы запретить-все в nginx. Это работает нормально, но когда я использую следующий PHP-скрипт для доступа к файлам изображений в папке, Chrome случайным образом отказывается загружать их, выдавая следующую ошибку: "net:: ERR_CONTENT_LENGTH_MISMATCH". С random я имею в виду, что иногда изображения будут загружаться нормально. Я пытался очистить выходной буфер до и после вызова readfile (), но ничего не решает проблему. Заранее спасибо за помощь!
PS: Если вы хотите увидеть больше исходного кода / конфигурационных файлов, просто дайте мне знать.Скрипт PHP:
<?php
if(!empty($_GET['tconst'])) {
//Included login script contains this method
if(login_check($mysqlisecure)) {
$tconst = preg_replace( '#[^.w]#', '', $_GET['tconst'] );
$file = "{$_SERVER['DOCUMENT_ROOT']}/content/posters/{$tconst}.jpg";
if (file_exists($file)) {
$filesize = filesize($file);
header('Expires: '.gmdate('D, d M Y H:i:s GMT', time() + (60 * 60 * 24)));
header("Content-Type: image/jpeg");
header("Content-Length: ".$filesize);
readfile($file);
}
}
}
exit();
2 ответа:
В конечном счете это была более глубокая проблема, чем просто PHP-скрипты. При последовательной загрузке изображений PHP5-fpm создает кэш, из которого он, вероятно, может обрабатывать запросы быстрее. Проблема заключалась в том, что папка кэша была сгенерирована во время тестирования конфигурационных файлов для nginx, работающего от имени root. Когда я переключился на "производство", PHP5-fpm и nginx не могли получить полный доступ для чтения/записи через эту папку с помощью user: www-data. Когда запрос на загрузку изображения повторялся несколько раз, PHP5-fpm попытался получить доступ к папкам кэша, но не смог и поэтому не завершил запрос, отправив клиенту только 65 536 байт. Простое исправление состояло в том, чтобы удалить папку кэша, расположенную по адресу /etc/nginx/fastcgi_temp, позволить PHP5-fpm регенерировать ее, и все работало.
Чтение лог-файлов nginx действительно помогло мне в этот раз