站点使用 CloudFlare CDN ,并启用 SSL 时,访问出现了无限 301 跳转,而访问源站是正常的,说明错误出现在 CloudFlare,经查询相关资料,解决了这个问题,整理一下做个记录。

简介

CloudFlare 是一家以向客户提供网站安全管理、性能优化及相关的技术支持为主要业务的 IT 企业。主要提供通过基于反向代理的内容分发网络(Content Delivery Network,CDN)及分布式域名解析服务(Distributed Domain Name Server),CloudFlare 可以帮助受保护站点抵御包括拒绝服务攻击在内的大多数网络攻击,确保该网站长期在线,同时提升网站的性能、加载速度以改善访客体验。

绑定域名

要使用 CloudFlare 提供的 SSL 泛域名证书服务,需要先绑定域名,绑定有两种方式,一是直接注册账号,将域名托管于 CloudFlare,二是通过合作伙伴,以 CNAME 方式接入,但不管是哪种方式,本质上都是使用 CloudFlare 的 CDN。

托管 DNS

这是最快的方式,在 DNS 页面,将需要启用 SSL 的域名右边的云图标点亮即可:

图 1

CNAME

CNMAE 方式无需将 DNS 托管于 CloudFlare,对于使用其他域名解析商又想用 CloudFlare CDN 和 SSL 证书的朋友这是非常有用的,本站已加入合作伙伴,具体接入方法参见:

启用 SSL

CloudFlare SSL 管理都在控制台 – Crypto 处,其实默认情况下,一接入 CloudFlare CDN 就启用了 SSL,这里说说需要注意的几个地方。

SSL

默认情况下,CloudFlare 启用的 SSL 模式是 Flexible,还有三个选项是 Off、Full、Full(strict):

 

那么这几个有什么区别呢?下面以几张图形象地阐释:

 

看明白了吗?

用户端到 CloudFlare 的访问称之为 A,CloudFlare 到服务端的访问称之为 B:

  • Off:全程 HTTP;
  • Flexible:A 使用 HTTPS,B 使用 HTTP,称为灵活加密;
  • Full:全程使用 HTTPS,允许 B 程服务端使用自签名证书;
  • Full(strict):全程使用 HTTPS,与 Full 的区别在于 B 程服务端必须使用有效的可信任证书;

到这里,我们就知道了为什么会出现 301 反复跳转了:

当服务端启用 HTTPS 时,一般都会再强制 HTTP 跳转 HTTPS,而 CloudFlare 默认启用的 SSL 策略是 Flexible。也就是说,当用户访问时,对于用户看到是 HTTPS,但对于服务器来说,访问方式却是 HTTP,所以服务器返回的状态都是 301。解决方法也很简单,将 SSL 策略设为 Full 或者 Full(strict) 即可。从 Flexible 和 Full(strict) 返回码中,我们也可以看出二者区别:

HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 05:39:59 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Set-Cookie: __cfduid=d98400c55561c1bb4f463fac5e43dcc581530423598; expires=Mon, 01-Jul-19 05:39:58 GMT; path=/; domain=.vi.net; HttpOnly
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 05:36:55 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Set-Cookie: __cfduid=d2793492c99cc8d14242c2cb6125b89ca1530423408; expires=Mon, 01-Jul-19 05:36:48 GMT; path=/; domain=.vi.net; HttpOnly; Secure

Automatic HTTPS Rewrites

 

如果网站包含通过 HTTPS 安全访问的 HTTP URL 的引用,则自动 HTTPS 重写可以提供自动将 HTTP 改为 HTTPS。

如何判断有没有 HTTP URL?如果通过 HTTPS 连接到站点并且小绿锁图标不存在,或者链接栏上有一个黄色警告三角形,则说明站点可能包含对 HTTP 资源的引用(“ 混合内容 ”),但某些外部资源可能根本没有 HTTPS,在情况下,Cloudflare 无法重写 URL。

Always use HTTPS

图 8

与 Automatic HTTPS Rewrites 差不多,可以理解为前者为能提升为 HTTPS 则提升,而此项为都提升。

Disable Universal SSL

图 9

从 CloudFlare 边缘节点删除 CloudFlare 颁发的证书,并禁止 CloudFlare 再颁发证书,此项影响当前域名的所有子域名。若禁用后续若启用上面说的几项配置,网站将无法访问。

其他选项,比如 HTTP Strict Transport Security (HSTS) 视需要是否开启,对用户访问影响不大。

经过这次问题处理经过,发现 CloudFlare 帮助中心本身已经比较完备了,使用中遇到使用问题,首先要做的应该去帮助查找解决方案,而不是去搜索引擎搜索。。。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注