Как отдать internal redirect

Бывают скрипты, ограничивающие доступ к статическим файлам. Мы видели много реализаций подобных скриптов на perl/php, которые после проверки прав доступа читали большие (мегабайты и гигайбаты) файлы побайтово или небольшими блоками и отдавали их nginx. Подобная логика работы крайне неоптимальна и создаёт очень большую нагрузку на сервер. Чтобы не создавать такой нагрузки, можно после проверки прав доступа в скрипте указать nginx, что он должен сам отдать этот файл.

Пример кода на php, для файла big-file.avi, который лежит в каталоге ./test/ относительно DOCUMENT_ROOT:

header("Content-Type:");
header("X-Accel-Redirect: /internal_xxx/test/big-file.avi");

Путь до файла должен быть абсолютным от DOCUMENT_ROOT, должен начинаться с /internal_xxx/, без точки в начале. При обработке такого запроса префикс “/internal_xxx” отбрасывается.

header("Content-Type:") нужно для автоматического определения майм-типа nginx-ом. Так же его можно указывать вручную.

Тэги: dev