nginx安装SSL证书以及反向代理tomcat问题汇总
tomcat不安装SSL证书,但可以通过Https协议访问tomcat。nginx安装SSL证书后,反向代理https请求不携带cookie的问题。nginx安装SSL证书后,其中的项目如果ajax或axios发送http请求会出现(已屏蔽:mixed-content)的情况。前后端分离项目,Vue的axios请求不携带Cookie
前情提要
nginx开启SSL模块教程:Nginx安装SSL证书前需要开启SSL模块
nginx安装SSL证书教程:腾讯云Nginx服务器SSL证书安装部署
一、tomcat没有安装SSL证书,但是想通过Https协议访问tomcat
此处使用的就是nginx的反向代理,本质上我们访问tomcat还是使用http协议,但我们通过nginx的反向代理,会先通过Https协议访问nginx,然后再通过nginx将Https请求转发为http请求发送给tomcat服务器。相当于加了一层请求转发,这也让我们可以不在tomcat上安装ssl证书就可以通过https协议访问tomcat。多集群下,nginx也支持负载均衡,所以我们通常是在nginx上安装SSL证书。
反向代理看着复杂,但其实只需要在nginx.conf上配置以下,具体看以下配置:
假定你的服务器地址为127.0.0.1;看到127.0.0.1就填你自己服务器的ip地址,看到8080就填你tomcat服务器的端口号。
【地理路径地址】:例如你想让 https://127.0.0.1/test 这个路径代理tomcat服务器,那么此处就填写/test。
【tomcat项目地址】:首先你要确定你所要代理的tomcat项目,然后在此处填写 https://127.0.0.1:8080/项目名
server {
。。。。。。。
location [代理路径地址] {
proxy_pass [tomcat项目地址];
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto https; #配置报文转发协议为https
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Cookie $http_cookie;
proxy_connect_timeout 30;
proxy_set_header Referer $http_referer;
proxy_cookie_path [/项目名] [代理路径地址]; #保证https和http的cookie一致
}
}
proxy_cookie_path介绍:proxy_cookie_path详细介绍
二、nginx安装SSL证书后,反向代理https请求不携带cookie的问题
首先这个问题,有好几个方面的影响,其中一个环节出问题,就都会出问题,所以请耐心看下去,我会尽量讲清楚。
1.nginx安装SSL证书后,其中的项目如果ajax或axios发送http请求会出现(已屏蔽:mixed-content)的情况,F12控制台会显示
解决办法:通过nginx反向代理tomcat,使所有请求都变成https请求,就不会出现此错误。
2.反向代理配置问题
如果你是按照我上面的反向代理的配置,那就不会出现问题,主要是要配置
proxy_set_header Cookie $http_cookie;
proxy_cookie_path [/项目名] [代理路径地址]; #保证https和http的cookie一致
这两项。
3.例:前后端分离,前端Vue,后端SSM(所以推荐前后端分离项目使用token)
Vue中axios是默认不带cookie的,所以要在main.js中添加代码如下:
import axios from 'axios';#如果有就不要加了
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
axios.defaults.withCredentials = true;
后端SSM中,我们要配置允许跨域,此处会有一点坑(本菜逼改了一天才找到)
首先,可以看一下这篇文章:前后端分离中本地调试和部署远端Cookie的不同
看完上面这一篇文章,就会明白,本地调试为什么没有cookie。
然后,我们在后端配置允许跨域时(SSM,Spring Boot本质一样都是Spring MVC)
通常会将'Access-Control-Allow-Origin' = "*",这样在同ip同协议下是可以的,但在Https、http请求转换下,我们就需要将'Access-Control-Allow-Origin' 设置为我们axios所请求的协议加ip,如我的axios请求为https://127.0.0.1/test,那么'Access-Control-Allow-Origin'就要设置为"https://127.0.0.1"。在SSM中的MVC.xml配置如下:
<!--前后端分离,允许跨域-->
<!-- 重中之重,反复观看 -->
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="axios所请求的协议加ip"
allowed-methods="POST, GET, OPTIONS, DELETE, PUT"
allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
allow-credentials="true" />
</mvc:cors>
更多推荐
所有评论(0)