Nginx代理动态域断开链接



在内部网络中,我们有大量的服务器/设备,希望能够将代理从web应用程序反向到。如果我在位置上下文中对目标IP进行硬编码,一切都会正常工作。例如:

location / {
proxy_pass  https://172.10.10.1/;
}

但当我使用变量作为宿主时,例如:

location / {
proxy_pass  https://$arg_target/;
}

其中$arg_target将是来自URL(如http://proxy.com?target=172.10.10.1)的172.10.10.1,则返回的页面将丢失CSS和Javascript资源,这是我们所寻找的功能的基础。

如有任何帮助,我们将不胜感激。提前谢谢。

将一个域用于许多不同的应用程序是一种棘手的方法,这可能会导致许多不同的问题。例如,如果两个或多个服务器设置了具有相同名称的cookie,它们将发生冲突,因为cookie是为域设置的,并且所有应用程序之间共享相同的域名。如果您的应用程序使用某种依赖cookie的会话机制,这将特别不方便。

更好的解决方案是为每个应用程序使用不同的子域,这可以通过基于"map"指令和通配符服务器名称的简单Nginx配置来实现。

话虽如此,让我们回到静态文件的原始问题上来。在这种情况下,一个可接受的解决方案是使用cookie实现您自己的会话。这个想法是在第一次请求时设置一个具有目标主机值的cookie。然后,如果其他请求(如对css文件的请求)没有目标参数,则可以使用该cookie的值来确定将请求代理到的服务器。

简单地说,这种类型的配置可以如下所示:

server {
...
set $target "$arg_target";
if ($target = "") {
set $target "$cookie_target";
}
add_header Set-Cookie "target=$target; path=/; domain=$host; max-age=3600";
location / {
proxy_pass  https://$target;
}
...
}

多亏了我的一位同事,他比我更了解Nginx和网络。我们没有走location路线,而是走server_name路线。

这意味着我们使用的不是从$uri值中提取IP,而是子域。下面是一个允许我们进行此操作的服务器配置示例:

server {
server_name ~^(?<ip>.+).devices.com$;
location / { 
proxy_pass https://$ip;
}
}

有了上面的配置,我们现在可以在浏览器的URL框中使用类似http://172.10.10.1.devices.com/terminal/的东西,一切都如预期的那样工作。

最新更新