最近在使用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变量名改为要访问的域名为变量了。希望对大家有帮助,避免入坑。