基于nginx部署单域名个性化主页 nginx

lake 2019-6-4 1416

在SAAS模式的系统中,其租户可以使用一个独立的登陆页面甚至一套首页。一般使用nginx进行反向代理设置。通过域名分发指向不同的
登录页面。分析和设置步骤如下:

整体思路

期初设计是按照租户每家分配一个三级域名(业务系统自身是二级域名),在nginx监听第三级域名进行访问定向分发,进入业务系统内部则按照统一进行分发。
后续查看系统实现,发现其登陆页面的实现包括两部分,一种部分是直接访问登陆页面,另一部分是拦截请求跳转到登录页,两部分的实现均是使用springmvc的forward的跳转。即访问一个controller路径,然后转发到登录页。
基于系统实现,我们发现由于后台controller路径只能唯一。不能设置个性化路径(不是技术层面,是框架层面的问题)。则基于域名定向分发的方案不可能实现。
由于系统forward的路径是在controller中指定的,存在转发时更换页面的可能性,因此我们使用在nginx中根据三级域名设置特定参数,使用nginx加入请求参数的方式传入后台,后台在合适地方根据特定参数设置登陆页面的地址,从而实现了个性化登陆主页的需求。

nginx实现

nginx实现分为两部分,一部分是拦截三级域名,另一部分是设置域名跳转,其中
拦截三级域名的代码:

if ($host ~* ^([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)$) {     
 set $subdomain $1;
}

设置域名跳转的代码:

location /{ 
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;    
   proxy_set_header REMOTE-HOST $remote_addr;    
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
   set $args_type $args;
   if ( $args_type = '') {
      set $args "loginpath=../hos/${subdomain}";
   }
   if ( $args_type != '') {
      set $args "${args}&loginpath=../hos/${subdomain}";
   }    
   proxy_pass http://地址;    
   proxy_redirect default;
}

后台部分

在controller中,增加对longinpath的监听,如果非空则直接跳转到其指定的页面:

String loginpath = WebUtils.getCleanParam(request, "loginpath");

if(!StringUtils.isEmpty(loginpath)) {    
  return loginpath;
}
return loginPage;

后记

  1. 目前设置的登陆页面的存放位置为:hos/{三级域名与}.jsp
  2. 部分客户使用IP访问系统,方式是为其开放一个独享的端口,在内部直接set $args.不在解析相关域名
最后于 2019-6-4 被lake编辑 ,原因:
最新回复 (0)
全部楼主
返回