网站使用nginx作为SSL的认证服务器,SSL认证的配置其实挺简单的:

ssl_certificate      xxx.crt;
ssl_certificate_key  xxx.key;
ssl_session_timeout  5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers XXXXX
ssl_prefer_server_ciphers  on;


配置完以后就可以使用,使用的过程中发现一个问题,由于证书配置在NGINX这里,经过NGINX反向代理到TOMCAT后已经是普通的HTTP请求。如果这个时候程序里面执行了redirect,由于tomcat的请求来自于ng的代理,tomcat不知道是https请求而认为是http请求。所以redirect后的链接发送到客户端浏览器以后就变成普通的http请求,这个时候浏览器就会请求普通的http服务,从原始的https请求变成了http请求,这个不是我们想要的结果。


好在NGINX已经考虑到这一点,我们可以通过

proxy_redirect http:// $scheme://;

将原本程序中redirect的http请求改为请求时的schema类型(https/http)。

我猜想大概的原理是改变了tomcat返回回来的header中的location。