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);
обратите внимание, что путь в заголовке должен начинаться со слэша.
Комментариев нет:
Отправить комментарий