Nginx переписать местоположение в подпапки

Мне нужна помощь, чтобы определить, как лучше всего разделить символы на подпапки? Что мне конкретно нужно, так это переписать URL-адрес /file/12345.jpg в путь /1/2/3/4/5/12345.jpg FS. (числа не ограничиваются только этими - они могут быть в любой комбинации цифр, например: /file/123.jpg, /file/123456789.jpg и т. д.)

Это базовая локация.

location ~ ^/file/(.+)\.(.+)$ {
   ....
}

Одна из возможностей состоит в том, чтобы описать все варианты:

location ~ ^/file/(\d)\.(.+)$ {
   alias /file/$1/$1.$2;
}
location ~ ^/file/(\d)(\d)\.(.+)$ {
   alias /file/$1/$2/$1$2.$3;
}

и так далее

но это некрасиво и не продуктивно.


person CappY    schedule 13.05.2020    source источник
comment
Я думаю, что любое решение будет включать регулярное выражение с несколькими захватами и использованием alias, root или try_files для поиска файла в файловой системе.   -  person Richard Smith    schedule 13.05.2020
comment
@RichardSmith Да, я знаю, что это может произойти с несколькими местоположениями / переписываниями. Это то, чего я пытаюсь избежать. :)   -  person CappY    schedule 13.05.2020


Ответы (1)


/file/12af5.jpg to /1/2/a/f/5/12af5.jpg:

location ~ ^/files/((\w)(\w)(\w)(\w)(\w))\.(.*) {
  rewrite "/$2/$3/$4/$5/$6/$1.$7" break;
}

Для более динамичной функциональности рассмотрите возможность использования rewrite_by_lua (требуется пользовательская сборка nginx) или используйте OpenResty, который включает его по умолчанию. Вы также можете проксировать запросы на внутренний сервер Python/Node/Php/etc для динамического перенаправления на выбранный вами язык.

person AnthumChris    schedule 13.05.2020
comment
Спасибо, я не думал, что это так сработает (потому что будет генерировать много ////). Это местоположение, которое я использовал. ` расположение ~ ^/файл/(\d?)(\d?)(\d?)(\d?)(\d?)(\d?)(\d?)(\d?)(\d ?)\.(.+) { псевдоним /var/www/files/$1/$2/$3/$4/$5/$6/$7/$8/$9/$1$2$3$4$5$6$7$8$9.$10; } `Есть ли другой вариант, который, например, будет вставлять / между каждым символом? - person CappY; 13.05.2020