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

Создавать прозрачный для пользователя блок местоположения в nginx, только если каталог существует

У меня есть каталог, который иногда существует, а иногда - нет. Если требуется и существует, все файлы в нем должны быть доступны, например как это

location /my_dir {
  root /other/www/root
}

Таким образом, если пользователь запрашивает http://myhost.example.com/my_dir/file и /my_dir существует, его следует обслуживать. Однако если каталог /other/www/root/my_dir не существует, nginx должен действовать как если бы блок местоположения никогда не определялся и для обработки запроса используются обычные правила. В частности, клиент не должен знать об этом специальном правиле, если каталог в настоящее время не существует, то есть для него не должно быть видимого для пользователя индикатора.

Одна из идей заключалась в том, чтобы поместить конфигурацию по умолчанию в указанное место и изменить приведенные выше строки на следующие (см. Как написать DRY, модульную конфигурацию nginx (обратный прокси) с именованными местоположениями):

location /my_dir {
  root /other/www/root
  try_files $uri $uri/ @default;
}

location / {
  error_page 418 = @default;
  return 418;
}

location @default {
  # all default stuff like the default root, index etc. goes here
}

Есть ли в этом смысл или есть лучший способ?

Обновить

Вот два примера конфигурации для nginx:

# Example 1
server {
  listen 80;
  listen [::]:80;
  server_name www.example.com example.com
  root /var/www/www.example.com
  index index.html index.htm
}

# Example 2
server {
  listen 80;
  listen [::]:80;
  server_name www.example.com example.com
  return 301 https://$server_name/$request_uri
}

В каждом случае я хотел бы добавить специальные правила для /my_dir местоположение, но только если специальный корневой каталог /other/www/root в настоящее время существует. В противном случае клиент не должен замечать особого отношения к /my_dir расположение.