我想做以下事情:
location ~ ^/(?<upstream>[^/]+)/ {
rewrite /$upstream/(.*) /api/public/$1 break;
if ($upstream = "auth") {
proxy_pass ${AUTH_SERVICE};
}
if ($upstream = "todos") {
proxy_pass ${TODO_SERVICE};
}
if ($upstream = "analysis") {
proxy_pass ${ANALYSIS_SERVICE};
}
if ($upstream = "stuff") {
proxy_pass ${STUFF_SERVICE};
}
if ($upstream = "users") {
proxy_pass ${USERS_SERVICE};
}
return 404;
}
使用proxy_pass
构建envsubst
值。
例如,public-api.com/auth/*
的请求将映射到auth-service.com/api/public/*
。
当我发出请求curl http://localhost:8000/auth/ping
时,我会收到404,但我可以直接点击auth-service.com/api/public/deep_ping
。
有人能发现实施中的错误吗?这样的事情是否可取?
答案 0 :(得分:0)
我认为问题是if
语句。如果if
匹配,则不会应用重写规则。
至少这是我在阅读If Is Evil文章后的理解。
处理非平凡逻辑的另一种方法是在Nginx中使用嵌入式脚本。例如,embedded perl或Lua(OpenResty的一部分)。设置它有一些开销,但是当你使用普通的编程语言时,实现复杂的逻辑会更容易,因为没有意外。
答案 1 :(得分:0)
感谢Philipp的链接。通过阅读,我能够理解这是如何工作的(并且是安全的):
location ~ /(?<api>[^/]+)/ {
set $backend 0;
if ($api = "auth") {
set $backend ${AUTH_SERVICE};
}
if ($api = "todos") {
set $backend ${TODO_SERVICE};
}
if ($api = "analysis") {
set $backend ${ANALYSIS_SERVICE};
}
if ($api = "stuff") {
set $backend ${STUFF_SERVICE};
}
if ($api = "users") {
set $backend ${USERS_SERVICE};
}
if ($backend = 0) {
return 404;
}
rewrite /([^/]+)/(.*) /$2 break;
proxy_pass $backend;
}