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

马谦马谦马谦
马谦马谦马谦
马谦马谦马谦
614
文章
12
评论
2019年4月27日20:07:06 评论

一、问题描述

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

软件环境:

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

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

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

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

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

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

因为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之后返回重定向次数过多的问题

  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
C++11中const_cast的真实使用场景 C/C++

C++11中const_cast的真实使用场景

一、const和成员函数的故事 const的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候const限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内...
C++11中的override和final关键字 C/C++

C++11中的override和final关键字

一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过: virtual int func() override {} 不通过的原因是:同时使用virtual和overri...
创建自签名CA和SSL证书 计算机网络

创建自签名CA和SSL证书

一、创建CA CA全称是CertificateAuthority,意思是证书颁发机构。只有当CA被认为是受信任的颁发机构时,经过该CA颁发出来的证书才属于受信任的证书。否则,认为证书是不受信任的。 为...
路漫漫其修远兮,吾将上下而求索 这里是生活

路漫漫其修远兮,吾将上下而求索

博客从17年毕业开始建立,到现在维护了3年的时间,一直在断断续续的写着。对于这个博客,起初想的是记录下自己在技术道路上的点点滴滴。但写着写着就发现,除了记录下日常的学习和工作以外,还有一个更重要的作用...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: