Вопрос или проблема
Во время моего развертывания я создаю артефакты, которые представляют собой папки с статическими файлами — html, css, js. Они копируются на сервер в папку /usr/share/nginx/html/${SHORT_COMMIT_HASH}.
Сайт, например, доступен по ссылке.
site.com/${SHORT_COMMIT_HASH}
Запросы выглядят следующим образом:
site.com/9f9b348b/some_url_1/1
site.com/9f9b348b/some_url_2/2
Мне нужно, чтобы при вводе любой ссылки, начинающейся на site.com/${SHORT_COMMIT_HASH}, отображался index.html из директории /usr/share/nginx/html/${SHORT_COMMIT_HASH}.
У меня есть конфигурация nginx для этого:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
}
location ~ ^/([a-zA-Z0-9]*)/ {
root /usr/share/nginx/html;
try_files $uri $uri/ /$1/index.html;
}
}
Но у меня возникла проблема. Файлы css, js nginx пытается найти не в site.com/${SHORT_COMMIT_HASH}, а в корне site.com/.
Как я могу изменить root для location / так, чтобы для каждого запроса был свой root, относительно ${SHORT_COMMIT_HASH}?
Как я могу сделать это с помощью переменных:
location / {
root /usr/share/nginx/html/${SHORT_COMMIT_HASH};
}
Я нашел решение с sub_filter:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /$1/index.html;
location ~ "^/([a-z0-9]{8})/" {
try_files $uri /$1/index.html = 404;
sub_filter_once off;
# sub_filter_types text/html; # переопределитель на основе mime-типа
sub_filter '/static' '/$1/static';
}
}
location ~ ^/([a-zA-Z0-9]*)/ {
root /usr/share/nginx/html;
try_files $uri $uri/ /$1/index.html;
}
}
Ответ или решение
Для настройки динамического корневого пути в конфигурации NGINX следует рассмотреть, как правильно использовать переменные и подстановки в конфигурационных файлах. Ваша цель – сделать так, чтобы все запросы, начинающиеся с site.com/${SHORT_COMMIT_HASH}
, обрабатывались правильно и доставляли пользователю index.html
из соответствующей директории, а также корректно обслуживали статические файлы, такие как CSS и JavaScript.
Вот подход, который поможет вам достичь желаемого результата:
1. Использование регулярных выражений для обработки путей
Вы можете использовать регулярные выражения для захвата SHORT_COMMIT_HASH
из запроса и перенаправления всех запросов к соответствующей директории, где находятся ваши статические файлы.
2. Пример конфигурации NGINX
Вот пример корректной конфигурации, который учитывает ваши требования:
server {
listen 80;
server_name localhost;
# Обработчик для главного пути
location / {
# Пробуем найти файл, если его нет — переходим к редиректу
try_files $uri $uri/ =404;
}
# Обработчик для динамических путей
location ~ ^/([a-zA-Z0-9]{7,})/ {
# Захватываем SHORT_COMMIT_HASH
set $commit_hash $1;
# Устанавливаем root на основе захваченной переменной
alias /usr/share/nginx/html/$commit_hash;
# Пробуем найти запрашиваемый файл или папку
try_files $uri /index.html;
}
}
3. Объяснение конфигурации
-
location /: Этот блок обрабатывает все запросы по корневому адресу. Он сначала проверяет наличие запрашиваемого файла или папки. Если файл не найден, возвращает 404.
-
location ~ ^/([a-zA-Z0-9]{7,})/: Этот блок обрабатывает маршруты, соответствующие паттерну
SHORT_COMMIT_HASH
.set $commit_hash $1;
— этот оператор устанавливает переменную$commit_hash
равной захваченному значению из URL, которое соответствуетSHORT_COMMIT_HASH
.alias /usr/share/nginx/html/$commit_hash;
— используется для указания путей к статическим файлам.alias
позволяет использовать динамические пути в конфигурации.try_files $uri /index.html;
— проверяет наличие запрашиваемого файла. Если файла не существует, NGINX отдаетindex.html
, что обычно является точкой входа вашего одностраничного приложения (SPA).
4. Замечания
- При использовании
alias
, путям, которые указываются в этом блоке, не нужно использовать завершающий слеш (/
), иначе это может привести к некорректному поведению. - Убедитесь, что у NGINX есть права доступа к директории
/usr/share/nginx/html/${SHORT_COMMIT_HASH}
и что файлы находятся в правильном местоположении. - Если у вас есть дополнительные ресурсы (например, CSS или JS), которые вы хотите обеспечить, проверьте, что пути к ним остаются корректными относительно вашего динамического корневого пути.
Эта конфигурация позволит вам динамически обрабатывать различные версии вашего сайта, используя переменную $commit_hash
для выбора нужной директории с артефактами. Подходите к настройке конфигураций NGINX с осторожностью, и не забывайте тестировать изменения перед их развертыванием на боевых системах.