在内部网络中,我们有大量的服务器/设备,我们希望能够从web应用反向代理到这些服务器/设备。如果我在位置上下文中对目标IP进行硬编码,则一切正常。例如:
location / {
proxy_pass https://172.10.10.1/;
}但是当我使用一个变量作为主机时,例如:
location / {
proxy_pass https://$arg_target/;
}如果$arg_target是来自http://proxy.com?target=172.10.10.1之类的URL的172.10.10.1,则返回的页面将丢失CSS和Javascript资源,这是我们正在寻找的功能的基础。
任何帮助都将不胜感激。提前谢谢。
发布于 2015-04-30 23:18:55
将一个域用于许多不同的应用程序是一种棘手的方法,这可能会导致许多不同的问题。例如,如果两个或多个服务器设置了同名的cookie,它们将发生冲突,因为cookie是为域设置的,并且所有应用程序之间共享相同的域名。如果您的应用程序使用某种依赖于cookie的会话机制,这将特别不方便。
更好的解决方案是为每个应用程序使用不同的子域,这可以通过基于"map“指令和通配符服务器名称的简单Nginx配置来实现。
话虽如此,让我们回到静态文件的原始问题。在这种情况下,一个可接受的解决方案是使用cookies实现您自己的会话。其思想是在第一次请求期间使用目标主机值设置cookie。然后,如果其他请求(比如对css文件的请求)没有target参数,您可以使用该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;
}
...
}发布于 2015-05-02 04:32:48
我们以一种不同的方式解决了这个问题,这要归功于我的一位同事,他比我更了解Nginx和网络我们选择了server_name路线,而不是location路线。
这意味着我们不是从$uri值中提取IP,而是使用子域。下面是一个服务器配置的示例,它允许我们实现这一点:
server {
server_name ~^(?<ip>.+)\.devices\.com$;
location / {
proxy_pass https://$ip;
}
}有了上面的配置,我们现在可以在浏览器的地址框中使用类似于http://172.10.10.1.devices.com/terminal/的东西,一切都可以正常工作。
https://stackoverflow.com/questions/29955599
复制相似问题