Работая над новой версией существующего веб-приложения, мне нужно, чтобы nginx перенаправлял root (/) и несколько определенных URI для перенаправления в инфраструктуру v2 (с proxy_pass), в то время как не указанный URI должен быть перенаправлен в v1.
location = /specific_uri1
proxy_pass http://v2.webapp.com;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location = /specific_uri2
proxy_pass http://v2.webapp.com;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location / {
proxy_pass http://v2.webapp.com;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location /(.*)$ {
proxy_pass http://v1.webapp.com;
proxy_set_header Host v1-test.webapp.com;
add_header X-version v1;
add_header X-node $hostname;
}
Последняя директива местоположения никогда не сопоставляется, поэтому все, что не объявлено, попадает в веб-приложение v2. Я, конечно, неправильно понимаю, как nginx обрабатывает директивы.
Я протестировал множество конфигураций, ни одна из них не работает в моем случае.
Спасибо.
ОБНОВИТЬ:
Я обновил свою конфигурацию следующим блоком:
location ~* /specific_uri1/ {
proxy_pass http://v2.webapp.com:8008;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location = / {
proxy_pass http://v2.webapp.com:8008;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location / {
proxy_set_header Host v1.webapp.com;
proxy_pass http://v1-test.webapp.com;
add_header X-version v1;
add_header X-node $hostname;
}
Все запрошенные URI перенаправляются в правильную версию, но ресурсы из / specific_uri1 и из / (root) извлекаются из v1 (вместо v2), что приводит к ошибкам http 404. Мои активы загружаются из URI, например /js/main.js?v=0.9.0-sprint14
поэтому я думаю, что последний блок местоположения подходит для них. Поскольку обе версии моего приложения используют одно и то же дерево папок, я не могу указать расположение / js или / img. Как правильно с этим справиться?
location /
соответствует любому местоположению - если вы хотите только сопоставить /
, вы должны использовать location = /
. Видеть этот документ для подробностей.
Кроме того, в вашем местоположении регулярного выражения отсутствует ~
или ~*
оператор. Но последний блок местоположения в вашем вопросе должен быть location /
.
Вы можете упростить конфигурацию, используя одно регулярное выражение:
location ~* ^/(|specific_uri1|specific_uri2)$ {
proxy_pass http://v2.webapp.com;
proxy_set_header Host v2-test.webapp.com;
add_header X-version v2;
add_header X-node $hostname;
}
location / {
proxy_pass http://v1.webapp.com;
proxy_set_header Host v1-test.webapp.com;
add_header X-version v1;
add_header X-node $hostname;
}