如何根据 URL 参数重定向 HTTP 请求?

如何根据 URL 参数重定向 HTTP 请求?

我们在不同的主机(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
    }

如果您有特定的容器来处理该场景,则可以使用defaultmap发送给它。

map $arg_appType $destination {
    ....
    default http://error-handler-container:8000;
}

相关内容