Задать вопрос
ms-dred
@ms-dred
Вечно что то не то и что то не так...

Как задать в nginx определенную директорию с учетом GET запроса?

У меня есть картинки и для большего удобства пришлось использовать get запросы для формирования правильный уменьшенных копий.
К примеру /image.jpg?w=100&h=200&out=thumb
Чтобы отловить такие запросы в nginx прописан map, который по запросу формирует путь к картинке
map $args  $imgdir {
        default     "/image";
        ~^w=(\d+)&h=(\d+)&out=(small|thumb)  "/tmp/h$2";
    }


Далее nginx проверяет есть ли файл, если есть выводит, если нет, то отправляет в обработчик для создания копии.
location ~ ^/image/(?<imgfile>.+\.(jpg|JPG|jpeg|JPEG|png|PNG|webp|WEBP))$  {
        root $root;
        add_header Cache-Control "public, max-age=315360000";
        try_files $imgdir/$imgfile  @image;
    }

location @image {
        expires 1y;
        rewrite ^/image/(.*)$ /image?$args&image=$1? last;
    }


Мне необходимо сделать еще одно действие, которое изменяет путь до файла и пока не знаю как это сделать.
Я хочу некоторые картинки предоставлять в размытом виде, добавив в запрос &blur=true, что поможет мне отловить в обработчике GET запрос и создать копию в папке blurs

По факту путь доя картинки будет таким /image.jpg?w=100&h=200&out=thumb&blur=true
Мне нужно как то в map реализовать формирование пути в случае если blur отсутствует то оставить все как есть
~^w=(\d+)&h=(\d+)&out=(small|thumb) "/tmp/h$2";
Если же присутствует то
~^w=(\d+)&h=(\d+)&out=(small|thumb)&blur=true  "/tmp/h$2/blurs";


Отдельный map для этого создавать?
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
ky0
@ky0 Куратор тега Nginx
Миллиардер, филантроп, патологический лгун
Вместо того, чтобы всё усложнять и усложнять свою регулярку, сделайте условия с переменными-аргументами.
Ответ написан
Lynn
@Lynn
nginx, js, css
Как посоветовал ky0, лучше использовать явные аргументы вида $arg_name.

map $arg_h:$arg_blur $imgdir {
    default                "/image";
    ~^(?<height>\d+):true$ "/tmp/h$height/blur";
    ~^(?<height>\d+):      "/tmp/h$height";
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы