前段时间,将项目部署在现网时发现当执行登录以及退出时,发现所请求地址的端口默认丢失了。
因为之前项目没有问题,但是后来电信整体对所有项目进行漏洞扫描,发现此项目存在“登录前后的会话未更新”,修复后部署上线就发现此问题。所以最初以为是此问题造成的,就侧重对此问题进行追查,但是一直没有找到原因。接着,我在本地服务以及公司云服务进行测试发现均未发现此问题,就特别纳闷儿了。
最后发现,是因为本地服务以及云服务器没有通过Nginx转发到tomcat,现网环境使用了nginx + tomcat的架构, 采用nginx做了一层负载均衡代理,于是查看webapp获取到的requestURL,发现根本就没有浏览器发送的原始URL中的端口。问题就在于此, 浏览器发送的请求是交给nginx,而nginx转发请求给tomcat时,端口号已经丢失掉了,
解决方式
在网上找了下原因,发现Nginx配置有问题。
- 网站页面中直接读取了服务器ip和端口号。
- 在网站服务端不能正确获取到port.或者做重定向的时候地址总是丢掉端口(port)。
最简单的解决方案,修改Nginx的配置文件:
server {
listen 80;
server_name www.xxx.cn;
server_name_in_redirect off;
proxy_set_header Host $host:$server_port;
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;
location / {
proxy_pass http://***********:8080/;
}
}
默认请求
location / {
proxy_pass http://***********:8080/;
}
}
如上才是正确的配置nginx。其中的proxy_set_header Host server_port; 设置转发端口。这一行是关键。
网友评论