Я использую Nginx как обратный прокси для моего сервера приложений .
Сервер приложений получает запросы на загрузку файлов по этому маршруту:
/ files /: id
Затем приложение находит путь к файлу в файловой системе , т.е. / путь / к / файлу / с / id , и отвечает содержимым файла.
Я не хочу раскрывать файл путь к пользователю.
[nodejs / express]> файл содержимое [nginx]> файл содержимое [браузер] для этой архитектуры: [nodejs / express]> файл информация [nginx]> файл содержимое [браузер] информация о файле: Nginx должен сообщить браузеру исходное имя и mimetype файла.
имя файла хешируется в пути, и в имени файла нет никаких признаков его mimetype, поэтому я должен использовать информацию о файле, возвращаемую с сервера приложения. path
mimetype
originalname
Благодаря @MichaelHampton я использовал x-Accel
https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/
это пример конфигурации:
express:
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;
}
}
путь к файлу выглядит примерно так:
/ home / ypj / x / y / z
Вам необходимо настроить сервер приложений для перенаправления (не перезаписи!) URL-адресов, т.е. если я запрашиваю / files /: id, я должен получить перенаправление 301 на / путь / к / файлу.
Затем вам нужно настроить 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.