Tomcat+nginx项目在浏览器报安全隐患以及图片加载失败原因

场景还原,已经上线的项目报出的bug,在IE8跳转页面后,图片资源无法显示,以及chrome上出现安全限制警告。


在拿到问题后,百度了一下出现安全警告的情况,注意到其中有一种情况为:HTTPS页面中引用了HTTP资源,浏览器默认是不允许在 HTTPS里面引用 HTTP 资源的,所以会弹窗提醒脚本不安全,这时我想起来我那个项目不正是HTTPS访问的吗,于是我用chrome检查了出问题的页面代码,发现里面确实有引用到HTTP的资源,包括图片也是HTTP引用,我心想问题居然这么简单就找到了,打开Eclipse找到刚刚引用到HTTP的源码,原来源码里面不是直接引用的,而是使用JSP的一个变量,查看了这个变量的里面编译为http的值为request.getScheme(),这个值为啥会编译成http呢,赶紧查一下,在网上找到一篇博客《Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议》里面提到:nginx代理后request.getScheme() 的值总是 http,而不是实际的http或https,我想我的这个项目使用了https,那么是使用过nginx代理还是tomcat直接配置的证书呢?因为我对ssl和nginx都不太了解,我决定先将本地配置成HTTPS的访问方式,我使用了java内置的keytool生成ssl证书,这个我是有经验的,但中间不免出现问题,通过网上教程成功将本地改成了https访问,结果我再次审查源码发现并不是想上面博客里面提到的request.getScheme() 的值总是 http,而是https,那么问题来了,https方式访问并不会影响request.getScheme() 的值,那么原因只有一个,被nginx代理了ssl,确定问题所在解决起来就简单了,直接拿上面提到的博客里面的解决方案,因为只有正式服务器上使用了nginx的ssl,所以解决方案还不能直接更新到生产,先暂时放我这里,等销售谈好报价在给他们。


2017.12.22更新:

这个问题早已被解决,今将文章完善,供碰到此问题的童鞋参考。

上方的解决方案是被很多人验证过没有问题的,以防万一,我还是用自己的服务器测试一下。

首先,还原客户服务器上项目的运行环境、代码版本、nginx版本以及配置。问题不大,还原好后,使用nginx的ssl代理http,果然问题就出现了,资源引用还是http,被浏览器提醒安全隐患。

第二步,将上方的解决方案加到配置中,如下

nginx配置:

扫描二维码关注公众号,回复: 2337894 查看本文章
proxy_set_header       Host $host;
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;

tomcat配置:

<Valve className="org.apache.catalina.valves.RemoteIpValve"  remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto"  protocolHeaderHttpsValue="https"/>  
OK,没问题了! 附图

这时我又想到,资源引用为什么要用绝对路径呢?完全可以使用相对路径啊,这样就不会去读访问配置header,OK试一下,全部改成相对路径。



完全没问题,浏览器也没有报安全隐患了!

此致。

猜你喜欢

转载自blog.csdn.net/qq_27985509/article/details/78062177