Tomcat+nginx项目在浏览器报安全隐患以及图片加载失败原因
2017-09-22 13:53
591 查看
场景还原,已经上线的项目报出的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配置:
tomcat配置:
这时我又想到,资源引用为什么要用绝对路径呢?完全可以使用相对路径啊,这样就不会去读访问配置header,OK试一下,全部改成相对路径。
完全没问题,浏览器也没有报安全隐患了!
此致。
在拿到问题后,百度了一下出现安全警告的情况,注意到其中有一种情况为: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配置:
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试一下,全部改成相对路径。
完全没问题,浏览器也没有报安全隐患了!
此致。
相关文章推荐
- nginx 配置后网站图片或js 加载出来一半或者不出来刷新才可以,chrome 浏览器访问项目时加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH:
- tomcat中部署项目后,访问失败,报错404的原因以及解决方案
- iOS webView加载网页失败,浏览器成功的原因,以及读取cookie
- sd_setImageWithURL加载图片失败原因以及处理方法
- Spring学习(一)tomcat加载web.xml、以及项目集成Spring支持
- 使用springMVC搭建系统时项目出现红叉以及启动tomcat出错的原因
- Tomcat 利用server.xml进行其他盘符的其他项目映射的部署以及JSP引用其他盘符的图片(虚拟目录及虚拟路径)
- Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案
- 使用Tomcat部署项目在浏览器中访问的时候JS和CSS等静态文件无法加载的问题
- mac下 安装tomcat 后项目无法启动以及 错误 找不到或无法加载主类
- tomcat项目使用nginx中的图片和文件下载
- jsp网页在浏览器中不显示图片_eclipse环境下配置tomcat中jsp项目的虚拟路径
- nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
- tomcat多主机多实例,以及无法加载项目的处理
- Android使用webview调用系统浏览器以及项目内显示并支持图片和输入
- Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案
- thinkphp框架写的项目在nginx下无法正常访问报错的原因以及解决方法
- 图片分享和加载失败的原因之一
- nginx加载静态资源失败原因排查
- Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案