首页 > 系统相关 >Nginx SSL+tomcat,request.getScheme() 取到的协议不正确

Nginx SSL+tomcat,request.getScheme() 取到的协议不正确

时间:2023-02-23 15:25:32浏览次数:69  
标签:http Forwarded tomcat Nginx request js SSL proxy https

原文地址:https://blog.csdn.net/caicaimaomao/article/details/126362415

现象:使用Nginx代理tomcat,使用https访问,在火狐浏览器下无法访问。

没有使用Nginx时,直接通通过tomcat访问,https://xxxx,系统可以正常访问。但是加上Nginx之后,在谷歌浏览器下可以正常访问,到那时在火狐浏览器访问提示:

Content Security Policy: 升级不安全的请求“http://coach.xxxxx.com/s/js/jquery.js”至使用“https”(未知)
Content Security Policy: 升级不安全的请求“http://coach.xxxxx.com/messageController.do?queryMessageOut”至使用“https”(未知)
Content Security Policy: 升级不安全的请求“http://coach.xxxxx.com/messageController.do?queryMenuOut”至使用“https”

 

 在前后端分离之前,我们一般都是用JSP开发前段页面,这些前端页面和后台程序是放在同一个tomcat 下,在获取项目url时,我们会使用request.getScheme():

<% 
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
%>

这样我们就获得了完整的url地址,在引用js时一般会使用如下方式:

<script type="text/javascript" src="<%=basePath %>/js/jquery-1.8.1.min.js"></script>
<script type="text/javascript" src="<%=basePath %>/acharts/acharts.js"></script>

从火狐浏览器控制台打印的结果看,https访问时,这个request.getScheme()获取的协议还是http,查看getScheme源码信息:

Returns the name of the scheme used to make this request, for example, http, https, or ftp. Different schemes have different rules for constructing URLs, as noted in RFC 1738.
Returns:a String containing the name of the scheme used to make this request

这个方法注释写着可以返回http, https, or ftp,并且在没有Nginx的时候是可以正常访问的,说明Nginx转发时并没有带上协议进行转发。HTTP规范中的X-Forwarded-Proto就是用来识别协议的:

X-Forwarded-Proto(XFP)报头是用于识别协议(HTTP 或 HTTPS),其中使用的客户端连接到代理或负载平衡器一个事实上的标准报头。您的服务器访问日志包含在服务器和负载平衡器之间使用的协议,但不包括客户端和负载平衡器之间使用的协议。要确定客户端和负载平衡器之间使用的协议,X-Forwarded-Proto可以使用请求标头。

为了正确地识别实际用户发出的协议是 http 还是 https,需要在Nginx配置文件的location中加入X-Forwarded-Proto:

location / {
    proxy_pass http://gtsserver;
    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的配置文件也要做改动,用来正确的接收转发的协议, 在<Engine name="Catalina" defaultHost="localhost">下面加入:

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

 

标签:http,Forwarded,tomcat,Nginx,request,js,SSL,proxy,https
From: https://www.cnblogs.com/dyh004/p/17148072.html

相关文章

  • pip install requests报错
    1.执行pipinstallrequests报错2.执行python-mpipinstall--upgradepip仍然报错3.最后使用国内源命令下载pipinstallrequests-ihttp://pypi.douban.com/simp......
  • sshd 报错内容:libssl.so.10: cannot open shared object file: No such file or direc
    问题原因缺少文件libssl.so.10文件有软连接创建完成查看/usr/local/lib64/目录下是否存在这2文件如果缺少软连接就重新创建如果缺少源文件重装openssl解决或者重新......
  • 手把手教你为基于Netty的IM生成自签名SSL/TLS证书
    1、引言对于IM聊天应用来说,为了提升安全性,对聊天消息加密是常规操作。众所周之,Netty是高性能的JavaNIO网络通信框架,因而用Netty来写IM是再正常不过了。网上关于为Netty......
  • spring boot内置tomcat运行JSP报错
    =============================================== 2023/2/23_第1次修改                       粽先生 ==================================......
  • 重学前端性能优化: requestAnimationFrame & requestIdleCallback All In One
    重学前端性能优化:requestAnimationFrame&requestIdleCallbackAllInOne微任务队列,CPU调度,时间分片requestAnimationFramecancelAnimationFramerequestIdleC......
  • Tomcat部署
    Tomcat部署资源:1.在Tomcat目录文件下的conf/context.xml文件夹中添加<Environmentname="tjndi"value="hellothisisnewsproject"type="java.lang.String"/>2.......
  • HttpServletRequest获取请求体数据,
    //java8可用Stringbody=request.getReader().lines().collect(Collectors.joining());request.getReader().lines()得到一个stream流.collect(Collectors.joining()......
  • E013Web学习笔记-Request和Respons(一)
    一、Request原理和继承体系1、原理第一步:用户访问url,浏览器向服务器发出请求,请求携带着请求消息数据;第二步:Tomcat服务器会根据请求url中的资源......
  • E010Web学习笔记-Tomcat
    一、web相关概念回顾1、软件架构C/S架构:客户端/服务器端;B/S架构:浏览器/服务端;浏览器内含静态资源解析引擎;浏览器请求数据,服务器响应来自浏览器的请求; 2、资源......
  • Intellij IDEA配置Tomcat并创建JavaWeb项目
    IntellijIDEA配置Tomcat并创建JavaWeb项目​​IntellijIDEA配置Tomcat并创建JavaWeb项目​​​​一、实验环境​​二、说明​​三、Web项目搭建​​​​四、运行Web项目​......