Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Скачивание файла с помощью X-Accel-Redirect

NGINX пишет not found, когда я пытаюсь скачать файл с сайта http://site.com/download/?id=95
папка /_files лежит на уровень выше /www, т.е.
тут скрипты: /site/www/
а тут файлы: /site/_files/
В папке /_files могут быть подпапки.
Конфиг сайта
server { listen *:80; ## listen for ipv4 server_name site.com; access_log /var/log/nginx/access-site.log; location / { proxy_pass http://127.0.0.1:88/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 120; proxy_send_timeout 120; proxy_read_timeout 180; }
location /download/ { internal; alias /var/sites/site/_files/; }
location ~* \.(jpg|jpeg|gif|png|webp|ico|css|bmp|swf|js|html|txt)$ { root /var/sites/site/www; }
}
Скрипт который скачивает файл
header("X-Accel-Redirect: /download/".$route); header("Content-Type: application/x-force-download"); header("Content-Disposition: attachment; filename=\"".$file."\"");
В итоге заголовок выглядит так
X-Accel-Redirect: download/content/95/arch.rar
В чем может быть проблема?


Ответ

проблема оказалась в попытке использования внутреннего (internal) location-а /download в качестве внешнего (для ссылок из внешнего мира вида http://site.tld/download/...).
внутренним этот location является по требованиям самого nginx-а для корректной работы механизма X-Accel
решается проблема переименованием location-а в какое-нибудь точно неиспользуемое имя. например:
location /intenal-download { internal; alias /путь/к/файлам; }
и одновременно надо возвращать соответствующее значение в заголовке X-Accel-Redirect. основываясь на приведённом примере, примерно так:
header("X-Accel-Redirect: /internal-download/".$route);
обратите внимание, что путь в заголовке должен начинаться со слэша.

Комментариев нет:

Отправить комментарий