я использую Nginx так как Обратный прокси для меня Сервер приложений.
Сервер приложений получает запросы на загрузку файлов по этому маршруту:
/ файлы /: идентификатор
Затем приложение находит путь к файлу в файловой системе т.е. / путь / к / файлу / с / id и отвечает содержимым файла.
Я не хочу открывать пользователю путь к файлу.
Есть ли способ сообщить Nginx путь к файлу, чтобы Nginx мог обрабатывать загрузку файла для пользователя, вместо моего сервера приложений, я не хочу использовать Nginx только в качестве обратного прокси или кеш-сервера, мне нужно больше сервера приложений от Nginx.
Обзор:
Хотите отказаться от этой архитектуры:
[nodejs / express]> файл содержание [nginx]> файл содержание [браузер]
к этой архитектуре:
[nodejs / express]> файл Информация [nginx]> файл содержание [браузер]
информация о файле:
path
mimetype
originalname
Nginx должен сообщить браузеру исходное имя и mimetype файла. имя файла хешируется в пути, и в имени файла нет никаких признаков его mimetype, поэтому я должен использовать информацию о файле, возвращаемую с сервера приложений.
Благодаря @MichaelHampton Я использовал x-Accel
https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/
это образец конфигурации:
экспресс:
if (file_info.mimetype.split('/')[0] === 'image') {
res.header(
'Content-Disposition',
'inline');
} else {
res.header(
'Content-Disposition',
'attachment; filename=' + file_info.originalname);
}
res.header('Content-Type', file_info.mimetype);
res.header('X-Accel-Redirect', file_info.path.split('/home')[1]);
nginx:
location ~ ^/ypj* {
internal;
root /home;
}
location ~ .* {
if ($host ~ ^cdn\.(.+)$) {
proxy_pass http://127.0.0.1:4000;
}
}
путь к файлу выглядит примерно так:
/ главная / ypj / x / y / z
Вам необходимо настроить сервер приложений для перенаправления (а не перезаписи!) URL-адресов, т.е. если я запрашиваю / files /: id, я должен получить перенаправление 301 на / path / to / file.
Затем вам нужно настроить nginx для обслуживания файлов из локальной файловой системы, если они найдены, и возврата к обратному прокси-серверу, если они не найдены.
Что произойдет:
Что-то вроде этого:
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://ip:80;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
РЕДАКТИРОВАТЬ: если вы не хотите, чтобы пользователь знал истинный URL-адрес файла, ваш единственный вариант - попросить удаленный сервер перевести URL-адрес или создать логику для выполнения сопоставления внутри самого nginx. Это можно сделать, переключившись с nginx на openresty и используя lua-resty-http: https://github.com/pintsized/lua-resty-http
nginx имеет очень ограниченную логику формы поддержки для выполнения подобных операций, чтобы узнать имя файла для обслуживания.
Вам нужно изменить свое приложение так, чтобы вместо выдачи URL /files/:id
пользователям будет предоставлен URL-адрес фактического статического файла.
Другой вариант - просто добавить кеширование в nginx.