Хотя этот ответ может и не представлять собой «наилучшую практику», он работает хорошо
Мы используем внутренний сервер с apache в качестве своего рода «файлового сервера» - для обслуживания личных файлов и изображений, которые пользователи загружают в свою учетную запись. Вот как это работает:
Настройте mod_rewrite для обработки URL-адресов по вашему усмотрению. Например:
RewriteRule /content/(.*) /ServeContent.php?FileName=$1
Скрипт ServeContent.php сделает следующее:
1. Validate input
2. Authenticate user based on cookie or session data
3. Make a URL with $_GET['FileName'] and the IP of the backend server
http://192.168.1.30/content/somefile.jpg
4. Set appropriate headers for the file type
header('Content-type: image/jpeg')
5. readfile($URL)
Этот подход требует, чтобы fopen-wrappers были включены в PHP. readfile
не будет хранить содержимое в памяти, так что это действительно не использует много памяти. Одним из основных недостатков является то, что вы задержите процесс apache / php на время запроса (который может занять много времени). Но в действительности у вас, вероятно, не будет проблем, если вы не используете сайт с большим трафиком.
Если да, то, скорее всего, есть лучшие решения. Но это сработало для нас очень эффективно для больших файлов в различных приложениях.