一、需要解决的问题
使用nginx反向代理服务器,代理tomcat,使用http代理没有,正常配置没有问题,可以正常拦截代理。但是需求变动要求使用https进行访问,此时对nginx配置进行修改支持https模块。然后申请对应ssl证书进行相关配置,修改完成后发现在代码中有使用request.getRequestURL() 无法获取浏览器中请求地址,此处小记。
二、nginx对https模块支持:
此处在编译安装nginx时进行配置,具体见nginx编译安装
三、nginx配置https样例如下:
http{
upstream myserver{
server 192.168.0.11:8080;
}
server {
listen 8888 ssl; #在监听端口后添加ssl,前提nginx已经支持ssl
server_name localhost;
ssl_certificate /usr/local/soft/nginx/conf/cert/server.crt; #证书地址
ssl_certificate_key /usr/local/soft/nginx/conf/cert/server.key; #证书地址
location ~ ^/test {
proxy_set_header Host $http_host;
#设置代理的端口,与tomcat中配置(portHeader="x-forwarded-port")配合使用,因为在代码中想要使用request.getServerPort() 获取到8888,如果不配此项导致获取到的端口为443(https默认的端口),同时request.getRequestURL() 获取到url地址可能是不含有端口的
proxy_set_header X-FORWARDED-PORT $server_port;
# 设置代理的协议头 https ,与tomcat中的配置(protocolHeader="x-forwarded-proto")配合使用,tomcat 需要添加的配置见后面
proxy_set_header X-Forwarded-Proto $scheme;
# 对http 代理协议头修改为https
proxy_redirect http:// https://;
proxy_pass http://myserver;
}
}
}
四、tomcat中server.xml需要添加的配置
<Valve className="org.apache.catalina.valves.RemoteIpValve"
portHeader="x-forwarded-port"
protocolHeader="x-forwarded-proto"
/>
x-forwarded-port : 与nginx中设置代理端口对应
x-forwarded-proto : 与nginx中设置代理协议头对应
五、小结
- 完成上述配置后,在代码中使用request.getRequestURL() 可以拿到浏览器地址栏真实输入的地址。
- 获取到url地址协议头是https的,是正确的。
- request.getServerPort() 获取到的端口是nginx监听的真实端口8888