Вероятно, кому-то из вас все нижесказанное покажется капитанством, но в моей практике история повторяется раз за разом.
Есть фронтенд-приложение, которое в собранном виде — просто js/html-статика, отдаваемая nginx’ом напрямую в браузер пользователя (SPA). И тут возникает главный вопрос: а как прописывать URL до API бекенда?
Какие вообще есть варианты?
Первый (и самый часто встречающийся) — захардкодить URL при сборке фронта. Главный минус: при переносе на другой домен или развороте на новом стенде фронт придется пересобирать под новый адрес. Админы в восторге, конечно. А потом начинается: «ооой, а отключите нам пожалуйста CORS, у нас ничего не работает». Ну вообще-то CORS как раз для того и придумали, чтобы ничего не работало, когда не надо.
Второй вариант — как-то передавать URL через настройки. Но как? В статику особо ничего не передашь: это же скомпиленный в жс тупескрипт без собственного поведения на сервере.
Как обычно выкручиваются: веб-приложение ходит по относительному адресу без хоста. То есть берет текущий домен и к нему уже приделывает все остальное.
А на стороне nginx настраивается proxy_pass, который проксирует запросы с определенным префиксом (например,
/api/v1) дальше на бекенд.В итоге:
— не нужно отключать CORS;
— фронт всегда ходит на тот же хост и порт;
— URL автоматически валиден на любом стенде и домене;
— фронт не нужно пересобирать под каждый environment.
У самого nginx тоже нет нормального механизма передачи параметров внутрь конфига (я тоже удивился, когда узнал, может сейчас уже что-то прикрутили), но и тут обычно выкручиваются через subst/envsubst.
Может, у вас есть и другие варианты, но этот подход уже тысячу раз обкатан. Есть нюансики, конечно, но в целом работает.