Nginx系列-使用Nginx中遇过的坑

  最近在使用Nginx反向代理后,测试一些部署的项目时发现,一些重定向后出现502页面,再看url发现host发生了改变。发生改变host的原因在于Nginx中的upstream变量名。所以把遇过的坑记录下来,方便供大家参考和避免掉入同样的坑。

  我相信大部分网站都是用了拦截器或者过滤器,当要访问的页面要使用到个人信息的时候,都会使用拦截器拦截请求的url,待登陆成功后重定向到拦截的url中。如果要使用完整url重定向跳转,在拦截器使用request.getRequestURL()来获取要请求的url时,发生重定向后就出现502页面,url中的host变成了nginx配置中upstream的变量名。先来看下java拦截器主要代码和nginx主要配置。

Java拦截器主要代码:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse)resp;
    HttpSession session = request.getSession();
    if(session.getAttribute("manager") == null){
        String url = request.getRequestURL().toString();
        //资源文件
        if(url.startWith("login.html"))
            chain.doFilter(request, resp);
        //没有登录,进行拦截
        else
            response.sendRedirect(request.getContextPath() + "/login.html?returnURL=" + url);
    }
    else
      chain.doFilter(req, resp);
}

Nginx配置:

upstream servers{
    server moto.bnuz163.com:8081 max_fails=1 fail_timeout=1s;
}

server {
    listen             80;
    server_name        moto.bnuz163.com;
    location / {
        proxy_pass servers;
        proxy_connect_timeout 2s;
    }

}

  当未登录访问时,拦截的请求url的host变为servers,重定向后完整url为:

http://moto.bnuz163.com/manager/login.html?returnURL=http://servers/manager/

  登录成功后,跳转到为http://servers/manager/的502页面,而这个host为servers恰好是nginx配置中upstream的变量名,很明显这不是我们想要的,我们要的是http://moto.bnuz163.com/manager/
  所以我们接下来把nginx配置中upstream的变量名改为访问的域名moto.bnuz163.com,修改后的配置:

upstream  moto.bnuz163.com{
    server moto.bnuz163.com:8081 max_fails=1 fail_timeout=1s;
}

server {
    listen             80;
    server_name        moto.bnuz163.com;
    location / {
        proxy_pass  moto.bnuz163.com;
        proxy_connect_timeout 2s;
    }

}

  这时再访问,我们从重定向后完整url中看到了拦截请求url的host变成moto.bnuz163.com了。

http://moto.bnuz163.com/manager/login.html?returnURL=http://moto.bnuz163.com/manager/


  小编自从掉入这个坑重新爬出来后,已经把所有项目的upstream变量名改为要访问的域名为变量了。希望对大家有帮助,避免入坑。

文章目录