Где то допустил ошибку и не могу сам разобраться.
У меня есть обработчик на node.js который создает уменьшенные копии картинок и доступен по адресу
/image?fit=resize&w=200&display=thumb&domain=site&image=90/pic.jpg
Так он создает уменьшенную копию в директорию на сервере
/var/www/server/public/tmp/site/w200/90/pic.jpg
Задача для Nginx просто отдать файл если он уже существует и не отправлять данные в обработчик, и тут у меня где то косяк.
В nginx.conf имеется map
map $arg_auto:$arg_fit:$arg_h:$arg_w:$arg_display:$arg_domain $image_path_file {
default "/o";
~^:(?<fit>resize|crop)::(?<width>(\d+)):(?<display>(low|thumb|large)):(?<domain>([a-z0-9.]+))$ "/public/tmp/$domain/w$width";
~^:(?<fit>resize|crop):(?<height>(\d+))::(?<display>(low|thumb|large)):(?<domain>([a-z0-9.]+))$ "/public/tmp/$domain/h$height";
}
По задумке при обращении к картинке по адресу
Site/o/pic.jpg?auto=cache&fit=resize&w=200&display=thumb&domain=large
Nginx должен отдать статику, если статики нет, отправить в обработчик
в location имеются следующие правила
server {
server_name SITE;
listen ip:443 ssl http2;
set $root /var/www/server;
set $imgpath /domain1/o;
set $imgpath1 /domain2/o;
set $imgpath2 /domain3/o;
set $imgpath3 /domain4/o;
root /var/www/server;
location ~ ^/o/(?<folder_image_file>.+\.(jpg|JPG|jpeg|JPEG|png|PNG|webp|WEBP|gif|GIF))$ {
add_header Cache-Control "public, max-age=315360000";
try_files $image_path_file/$folder_image_file $chunk_folder$imgpath3/$folder_image_file $chunk_folder$imgpath2/$folder_image_file $chunk_folder$imgpath1/$folder_image_file $chunk_folder$imgpath/$folder_image_file @image;
}
location @image {
expires 1y;
rewrite ^/o/(.*)$ /image?$args&image=$1? last;
}
}
Не обращайте внимание на $chunk_folder, он в случае неправильных переданных параметров содержит "../", что позволяет взять фулл картинку с другой папки.
Я вот не понимаю в чем дело, с путями до файла где то накосячил или что? =)