Назад | Перейти на главную страницу

Использование nginx try_files с несколькими деревьями каталогов

Я хотел бы, чтобы nginx обрабатывал запросы к определенному каталогу, проверяя, существует ли этот путь / файл в нескольких отдельных каталогах. Например, если в корне моего каталога было следующее:

images/siteA/foo.jpg
images/siteB/b/bar.jpg
images/siteC/example.jpg

мне бы хотелось http://example.com/images/foo.jpg вернуть файл foo.jpg, http://example.com/b/bar.jpg вернуть файл bar.jpg и так четвертое.

Я пробовал следующее, но он просто блокируется в циклах перенаправления (и я не хочу, чтобы он перенаправлял, а фактически отправлял файл по этому URL-адресу):

  location /images/ {
    try_files /siteA/images/
              /siteB/images/
              /siteC/images/ =404;

  } 

Я также пробовал использовать группы захвата, например location ~/images/(.*)/ и добавление $1 в конец URL-адресов. Я немного запутался в документации и не знаю, как это сделать с помощью nginx.

Вам нужно будет использовать регулярное выражение location для захвата части URI, следующей за /images/. Затем используйте try_files для тестирования серии URI с использованием каждого префикса сайта.

Например:

location ~ ^/images/(.*)$ {
    root /path/to/docroot/images;
    try_files /siteA/$1 /siteB/$1 /siteC/$1 =404;
}

Вы могли унаследовать значение root из окружающего блока, и в этом случае настройте параметры на try_files соответственно.

В качестве альтернативы принятому ответу вы можете использовать названное место (@my_path например), чтобы вернуться в другое место, например:

location / {
    root /etc/nginx/static;
    try_files $uri @index;
}

location @index {
    root /srv/http;
    try_files $uri $uri.html /index.html =404;
}