Nginx proxy_pass 仅限根和特定 URL

Nginx proxy_pass 仅限根和特定 URL

在现有 Web 应用程序的新版本上工作时,我需要 nginx 转发根(/)并将多个特定 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;
}

最后一个 location 指令从未匹配,因此未声明的所有内容仍将归于 v2 Web 应用程序。我肯定误解了 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 位置。处理这个问题的正确方法是什么?

答案1

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;
}

相关内容