由于项目使用Nginx做负载均衡,挂载两台服务器接收外部请求。
现需要限制外部请求IP访问,指定固定IP地址段可以访问服务器,因此需要对Nginx做allow和deny的配置。
做好之后发现可以登录系统,但是系统中的页面和菜单都打不开,
查询资料发现是由于在透明代理下,如果不做任何配置Tomcat认为所有的请求都是Nginx发出来的,这样会导致如下的错误结果:
1)总是http,而不是实际的http或https:request.getScheme()
2)总是false(因为总是http):request.isSecure()
3)总是Nginx请求的IP,而不是用户的IP:request.getRemoteAddr()
4)总是Nginx请求的Url而不是用户实际请求的Url:request.getRequestUrl()
5)总是Nginx请求的ip:request.getServerName()
6)总是Nginx请求的端口:request.getServerPort()
7)总是重定向到http上(因为认为当前是http请求):request.sendRedirect(相对url)
因此,如果对Nginx做了ip限制后,需要修改配置,
配置Nginx的转发选项:
proxy_set_header Host $host;//解决getRequestURL、getServerName、getServerPort
如果端口不是默认端口,需要改成proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; //解决getScheme、isSecure、sendRedirect
现需要限制外部请求IP访问,指定固定IP地址段可以访问服务器,因此需要对Nginx做allow和deny的配置。
做好之后发现可以登录系统,但是系统中的页面和菜单都打不开,
查询资料发现是由于在透明代理下,如果不做任何配置Tomcat认为所有的请求都是Nginx发出来的,这样会导致如下的错误结果:
1)总是http,而不是实际的http或https:request.getScheme()
2)总是false(因为总是http):request.isSecure()
3)总是Nginx请求的IP,而不是用户的IP:request.getRemoteAddr()
4)总是Nginx请求的Url而不是用户实际请求的Url:request.getRequestUrl()
5)总是Nginx请求的ip:request.getServerName()
6)总是Nginx请求的端口:request.getServerPort()
7)总是重定向到http上(因为认为当前是http请求):request.sendRedirect(相对url)
因此,如果对Nginx做了ip限制后,需要修改配置,
配置Nginx的转发选项:
proxy_set_header Host $host;//解决getRequestURL、getServerName、getServerPort
如果端口不是默认端口,需要改成proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; //解决getScheme、isSecure、sendRedirect