踩坑记录:CDN 开启强制 https 之后返回重定向次数过多的问题

马谦马谦马谦 未分类评论1,173字数 1278阅读 4 分 15 秒阅读模式

一、问题描述

搭了一个开源图床,因为备案的原因部署在海外。访问速度太慢准备上 CDN(有一个已备案的域名),但是在部署 CDN 的途中就出现了各种问题。鼓捣了几天终于解决了,记录下踩坑记录和解决方案。

软件环境:

踩坑记录:CDN开启强制https之后返回重定向次数过多的问题-图片1

图床是直接用 docker 部署了,没有再手动去折腾 lnmp 环境了,别人已经准备好的 docer 环境拿过来就直接用了。

用一个 nginx 作为 CDN 和图床服务的代理客户端,不直接把图床暴露出来了,也是一般服务的部署方式。

平常的服务大部分都是这么干的,用起来很舒服。

这个部署在 http 环境下是没有问题的,能正常使用。但是把 http 改成 https 的时候就出问题了,一开始的问题就是跨域:

踩坑记录:CDN开启强制https之后返回重定向次数过多的问题-图片2

因为 nginx 是配置的 http 反向代理:proxy_pass http://127.0.0.1:xxxx,到 docker 中的也是 http,所以它返回到前端的 js/css 资源也是 http 的。而此时 CDN 开启了强制 https,浏览器中已经是 https,跨域就这么产生了。

为了解决这个问题,就在 docker 的 web 环境中也加一个强制 https 跳转,想着 apache 也强制 https,那么就不会返回 http 资源,跨域解决。

想象是美好的,现实是残酷的,这么一配置之后,CDN 就挂了,原因:重定向次数过多

于是分析了一下,这么干确实有问题:

踩坑记录:CDN开启强制https之后返回重定向次数过多的问题-图片3

  1. nginx 反向代理是用的 http,对 apache 来说它收到了 http 请求,于是 302 重定向到 https 的页面。
  2. 然后 CDN 就访问重定向的 https 的页面,但是 nginx 收到之后又代理到 http 。

于是乎,CDN 和 apache 之间就因为 nginx 的存在而产生了某种误会,导致 302 死循环诞生!因此,这么干不行!得另寻它法。

那么现在的问题就产生了:如何圆润的以 https 的方式访问到 docker 内部的资源?

方案一:nginx 和 apache 改成 https 通信

这个方案要做的工作:

  1. 手动生成 https 证书
  2. 在 apache 内部署 https
  3. nginx 和 apache 通过 https 代理

apache 不熟悉,看了 https 部署比 nginx 要麻烦一些,而且内部通信也用 https 对性能有影响,所以就不考虑了 (虽然这个方法可能比较有效,但是内心比较排斥 apache,甚至想把 docker 中的 apache 换掉都不想用它配置 https) 。

方案二:使用 nginx 的 sub_filter 替换 http 为 https

验证了一下,不可行,因为实际上返回到客户端的资源文件都是相对文件目录,不是 http 的全路径资源。

于是就崩了,百度了几天也没有办法解决。最后,在 google 上搜,竟然一下就找到了解决方案。

二、完美解决方案

设置 http 头部 X-Forwarded-Proto,这个头部的作用是用于识别协议 (HTTP 或 HTTPS),主要针对内部访问重定向时的协议。因此,只要在反向代理时添加以下配置就好了:

$scheme 是 nginx 的内部变量,表明当前访问的协议,当前如果是 https,那么转发到后台服务的时候就是 https 。这样问题就解决了。

 
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2019 年 4 月 27 日 20:07:06
  • 转载请务必保留本文链接:https://www.dyxmq.cn/uncategorized/%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95%ef%bc%9acdn%e5%bc%80%e5%90%af%e5%bc%ba%e5%88%b6https%e4%b9%8b%e5%90%8e%e8%bf%94%e5%9b%9e%e9%87%8d%e5%ae%9a%e5%90%91%e6%ac%a1%e6%95%b0%e8%bf%87%e5%a4%9a%e7%9a%84.html
解决gvm工具无法下载安装包的问题 Golang

解决 gvm 工具无法下载安装包的问题

GVM(Go Version Manager) 是一款用于管理和切换不同 Go 语言版本的工具。它允许用户在同一台计算机上轻松安装、使用和管理多个 Go 版本,同时还能确保项目之间的依赖关系井然有序。 GVM 的主...
goland配置proto文件搜索路径 Golang

goland 配置 proto 文件搜索路径

默认情况下,goland(jetbrains 家的软件:idea 、 pycharm 、 phpstorm 以及 webstorm 都是一样) 安装 protobuf 插件后只会在一个特定的库路径下搜索 proto 文件。如果...
wireshark导出https证书 计算机网络

wireshark 导出 https 证书

一、找到证书所在的数据包 证书是从服务端返回的,从 https 握手的过程来看,当服务端返回了 server hello 之后,就会主动将自己的证书返回给客户端,因此只要从 server hello 往后面找 1-...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证