Я хотел бы, чтобы 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;
}