Nginx教程

nginx通过location划分反向代理多个网站

本文主要是介绍nginx通过location划分反向代理多个网站,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

通过location划分来反向代理多个网站,意思是使用同一个域下(协议、域名、端口均相同),通过路径的划分来代理不同的网站/服务。例如:a网站为 www.test.com/a/,b网站为www.test.com/b/,c网站为www.test.com/c/,这样的好处是只需要使用一个域名,abc三个网站之间不存在跨域问题,但坏处也很明显:

  1. 三个网站的cookie、webStorage都未隔离,如果没做好规划存在冲突的可能
  2. 有些代码中使用了绝对路径,那么在使用绝对路径时,跳转时用于区分网站的前缀"/a/”就会丢失

为了解决问题2,这里有几个方法,但并不是很完美:

  1. 使用ngx_http_sub_module模块对输出的内容进行过滤:
    这个模块并不是nginx默认的模块,但是nginx提供的官方docker镜像的最新版本中是有自带的,可以通过nginx -V来查看是否有安装
location /a/ {  
        proxy_pass  http://10.119.2.1/; #这里加斜杠意味着URI,nginx会把前缀 a/ 替换掉
        
        ······

        #通过直接替换的方式把输出内容中的URL替换掉
        sub_filter '="/luci-static/' '="/a/luci-static/';
        sub_filter ':"/luci-static/' ':"/a/luci-static/';
        sub_filter_types *;
        sub_filter_once off;
        proxy_redirect / /a/;  #替换重定向的URL
    }
  1. 很多情况下并不是所有的路径都可以被直接直接替换掉,有些路径是前端代码动态生成的,这种情况很难被完全替换
    通过请求header中的Refer去区分,例如:从www.test.com/a/1.html请求www.test.com/2.html,这个请求的Refer是www.test.com/a/1.html,但继续从www.test.com/2.html请求别的地址,Refer中就不再包含/a/了,所以这种方式只能兜底判断一层
   location / {
        proxy_set_header Host $host;
        #这里通过正则表达式去匹配refer的内容 
        if ($http_referer ~ ^https?://[\w\.:]*/a.*) {
            # 将其路由到127.0.0.1的一个路径前缀为/a/的地址
            rewrite ^(/.*)$ /a$1 break;
            proxy_pass http://127.0.0.1;
        }
    }
  1. 剩下依然无法被匹配的地址,可以手动通过正则或者前缀的方式增加location来完成匹配
这篇关于nginx通过location划分反向代理多个网站的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!