在现有 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;
}