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

Nginx proxy_pass только корень и конкретный URL

Работая над новой версией существующего веб-приложения, мне нужно, чтобы 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;
}