社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

详解https请求Nginx转发tomcat变成http问题

IT大咖说 • 4 年前 • 624 次点击  

概述

分享一个最近处理的nginx转发问题,简单记录下~


一、问题现象

简单架构为nginx做负载均衡,后端用tomcat做容器。浏览器和 Nginx 之间走的 HTTPS 通讯,而 Nginx 到 Tomcat 通过 proxy_pass 走的是普通 HTTP 连接。


通过域名访问可以正常登录,但是发现某个页面会存在异常,保存的时候会一直在加载中,具体原因为saved方法里面redirect重定向的时候变为http请求,当前页面为https协议,但是这个页面发起了一个http的ajax请求,这个是非法的。

F12查看报错:This request has been blocked; the content must be served over HTTPS.

如图:



分析

进一步分析后发现以下三个现象:

1)在排查代码之后并没有发现代码里有任何写死使用http协议的地方,而后又发现另一个应用也出现了这个情况,两个应用使用的框架分别是struts2和spring,这个问题似乎和框架无关。

2)而后发现原先部署在这两个应用之前的反向代理的协议从原来的http改成了https,但是这两个应用的tomcat并没有跟着升级成https而依旧是http。

3)经过进一步跟踪请求发现并不是所有请求都出现异常,而只有redirect的地方出现问题,而redirect的时候并没有使用https协议,而依然是http。


结合上面三个现象推论:

1)这个问题和框架无关

2)是tomcat和反向代理协议不一致造成的

3)问题出在redirect上


三、解决方法

1、Nginx对应server的location添加配置

将referer的请求scheme信息,用来作为当前请求的scheme,如此可以保证所有的请求都是同一个scheme,不会因为redirect而遗漏信息。

proxy_pass http://xxx/xxx/;
#实际调试时是发现之前的proxy_redirect设置成了off,在开启之后才解决nginx https协议转tomcat http协议问题
proxy_redirect http:// https://;
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
#该参数也需要配置,保证所有的请求都是同一个scheme
proxy_set_header X-Forwarded-Proto $scheme;

如上配置,经过nginx反向代理后的HttpServletRequest中header部分就带上了字段X-Forwarded-Proto。


2、Tomcat的配置srever.xml

2.1、 connector里添加

redirectPort="443" proxyPrort="443"



2.2、Host里添加

让tomcat在解析请求和做重定向的时候,知道用什么协议。主要的配置在server.xml里面的Engine下,定义一个Value元素。

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeaderHttpsValue="https" 
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto" />


这个配置里面,重点是protocolHeader字段,意思就是说,当protocolHeader字段的值为protocolHeaderHttpsValue的https的时候,认为是安全连接,否则就是http的非安全连接。






来源:

https://www.toutiao.com/i6920946541540803075/

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com



来都来了,走啥走,留个言呗~




 IT大咖说  |  关于版权 

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!



相关推荐


推荐文章


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/106913
 
624 次点击