nginx - 基于位置的动态 proxy_pass
问题描述
我正在尝试根据位置创建动态proxy_pass(在docker中运行并将流量重定向到托管http的docker堆栈,基于堆栈名称)
这是我当前的配置。我已经到了使用静态位置进行重定向的地步(在底部注释变体,蓝色/绿色重定向正确,应用程序运行正常)。我遇到了动态位置(~^/(?<ver>.*)/(?<rest>.*)?$)
的问题 - 目标 URL 的正确粘合存在问题。当我去的时候https://myapp.com/blue/
,nginx 会记录 dns 解析的问题blue could not be resolved (3: Host not found)
,看起来它会在$<ver>
in之后切断所有内容http://${ver}_${subdomain}/$rest
。我不是 REGEX 专家,我可能搞砸了location
,有什么建议吗?
server {
listen 80;
server_name ~^(?<subdomain>.+)\.(mydomain\.com|mydomain\.pl)$;
resolver 127.0.0.11 ipv6=off;
location ~^/(?<ver>.*)/(?<rest>.*)?$ {
set $target http://${ver}_${subdomain}/$rest;
proxy_pass $target;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# location ~ ^/blue/((?<rest>.*))?$ {
# set $exdomain http://blue_$subdomain/$rest;
# proxy_pass $exdomain;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# }
# location ~ ^/green/((?<rest>.*))?$ {
# set $exdomain http://green_$subdomain/$rest;
# proxy_pass $exdomain;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# }
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
send_timeout 90;
}
解决方案
*
在正则表达式中是贪婪的,因此$ver
将捕获直到最后一个 /
的所有内容,而不是/
您想要的下一个。
一种解决方案是使用非贪婪变体*?
(不要与 混淆?
),例如:
location ~ ^/(?<ver>.*?)/(?<rest>.*)?$ { ... }
但更好的解决方案是使用排除 的字符类,/
例如:
location ~ ^/(?<ver>[^/]+)/(?<rest>.*)?$ { ... }
请参阅有关正则表达式的有用资源。
推荐阅读
- c++ - 如果它只是“浅常量”而不是“深常量”,我应该声明方法“常量”吗?
- reactjs - 部署生产构建时 React App 空白页面
- image - XAML 将图像加载到网格中
- node.js - 未返回 NodeJS 请求
- html - 垂直居中不适用于 flexbox
- c# - 表单中未收到从视图中发送的数据
- eclipse - eclipse 没有在大纲中列出关于第二类的详细信息,我也不能在同一个文件的第二类中放置断点
- html - :not(:placeholder-shown) 不能与相邻兄弟组合器一起使用
- java - hibernate:无法执行 JDBC 批量更新
- python - Pandas:为列上的重复添加指示器