我们在不同的主机(Host-P、Host-Q)上运行两个 Jetty 容器。其中一个容器部署了一些应用程序(App-A、App-B、App-C)。另一个容器也部署了一些应用程序(App-X、App-Y、App-Z)。
Host-P => App-A,App-B,App-C
Host-Q => App-X,App-Y,App-Z
myapp.test.com 是 Web 客户端可访问的主要主机。我的 Web 客户端知道需要调用的应用程序。我在 URL 参数中传递此应用程序类型。URL 将类似于
http://myapp.test.com/?=appType=App-A
http://myapp.test.com/?=appType=App-B
http://myapp.test.com/?=appType=App-Y
http://myapp.test.com/?=appType=App-X
我需要根据 URL 参数配置路由逻辑。我可以在myapp.test.com只进行路由的主机?我需要查找哪个配置文件?
答案1
如果查询参数引用的是可以直接寻址的容器,则可以proxy_pass
直接将其传递给它,例如:
proxy_pass http://$arg_appType;
但这是使用不受信任的输入,也是一个巨大的安全漏洞。考虑一下?appType=www.google.com
。我以这个为例来说明不是去做。
相反,使用map
将查询参数映射到目的地:
map $arg_appType $destination {
App-A http://container1:8443;
App-B http://container2:5000;
App-X http://container24:9001;
App-Y https://some.remote.host;
}
现在您可以proxy_pass
直接访问它。
proxy_pass $destination;
但是您还应该拦截给出未知或否定答案的情况appType
。
if ($destination = "") {
return 403; # or do something else appropriate
}
如果您有特定的容器来处理该场景,则可以使用default
来map
发送给它。
map $arg_appType $destination {
....
default http://error-handler-container:8000;
}