域名 DNS 服务托管至 Cloudflare 以及 301 重定向的配置
文章包含以下重定向需求的解决:
名称 | 原地址 | 重定向后地址 | 原因 |
---|---|---|---|
HTTP 重定向到 HTTPS | http://a.com |
https://a.com |
需全站跳转 HTTPS |
WWW 重定向到根 | https://www.a.com |
https://a.com |
提高网站可达率 |
去掉 index.html |
https://a.com/xxx/index.html |
https://a.com/xxx/ |
统一路径、维持数据统一性 |
补齐末尾斜杠 / |
https://a.com/xxx |
https://a.com/xxx/ |
统一路径、维持数据统一性 |
链接重写与链接重定向的区别
链接重写 Rewrite
相似概念:Rewrite URL(Cloudflare)、重写回源 URL(阿里云 CDN)、回源 URL 重写(腾讯云 CDN)、隐性 URL 转发(阿里云云解析)
简单来说,链接重写就是用户在请求 https://a.com/p/a.txt
资源时,当请求经过某个中间机构时,中间机构将请求替换为另一个链接,如 https://b.top/img/a.txt
,并将新链接下的资源返回给用户。但是用户对所有这些替换操作均不知情,用户浏览器中的地址不会改变。
比如阿里云 CDN、腾讯云 CDN 均提供了「重写回源 URL」的功能:
链接重写常用于隐藏源站的真实 URL 结构,保护源站信息;或者通过 URL 映射,让 CDN 节点回源到不同的源站目录。
链接重定向 Redirect
相似概念:Redirects(Cloudflare)、重写访问 URL(阿里云 CDN)、访问 URL 重写(腾讯云 CDN)、访问重定向(多吉云 CDN)、显性 URL 转发(阿里云云解析)
而链接重定向是指用户在请求 https://a.com/p/a.txt
资源时,中间服务结点告诉用户这个资源已经移到了 https://b.top/img/a.txt
,用户的浏览器接收到这个请求后又发了一次 https://b.top/img/a.txt
请求。用户浏览器中的链接发生了变更。
比如阿里云 CDN 提供了「重写访问 URL」的功能:
重定向常用于将旧域名的 URL 迁移、映射到新域名;或者为移动端和 PC 端提供不同的 URL。
重定向 HTTP 返回代码一般为 3XX。301 为永久重定向;302、303、307 为临时重定向。临时重定向和永久重定向的区别可以看 这篇文章。
链接重定向的时机
DNS 解析链接地址的大致流程如下:
如果我们把上面 DNS 递归解析、迭代解析的过程拉平,并取出其中的主要结点,那么可以得到下图:
我们可以通过以下三种结点进行链接重定向。
在 NS 端重定向:
- 阿里云/腾讯云云解析。添加一条「显性 URL 转发」的记录。但由于博主没能通过这种方式成功实现自己的目的。
- Cloudflare 重定向规则。本文后半部分将讲述这个操作步骤。
在其他 DNS 服务中重定向:
- 阿里云 CDN 提供的重写访问 URL 功能。支持 302、303、307 重定向。其他重定向代码可以另行申请。详看:配置访问URL重写与重定向_CDN(CDN)-阿里云帮助中心
- 腾讯云 CDN 提供的访问 URL 重写功能。仅支持 302 重定向。详看:内容分发网络 CDN 访问 URL 重写配置-配置指南-文档中心-腾讯云。HTTP 转 HTTPS 为内置可选功能。
- 多吉云 CDN 提供访问重定向功能。支持 301 重定向。
- Vercel Redirect。详看 Deploying & Redirecting Domains。
在服务器上使用反向代理进行重定向:
- Nginx。通过写一堆规则可实现一些简单的重定向。博主的实践经历写在 这篇文章 中。但博主对于一些复杂重定向的尝试(文章开头提到的)都没能配置成功,总是陷入循环重定向。
使用 Cloudflare 的 DNS 服务
使用 Cloudflare 的 DNS 解析服务原因有以下几点:
- 免费
- 可抵御部分 CC 攻击、DDoS 攻击
- 可进行重定向
- 数据可视化
- 托管后屏蔽源站 IP
- 国内解析速度不算慢(暂时)
目前国内网站接入 CloudFlare 一般有两种方式,分别是 DNS 接入和 CNAME 接入。这里介绍 DNS 接入方式。
DNS 接入意思就是把域名管理解析服务商变更为 CloudFlare 来管理,如国内阿里云 DNS、腾讯云 DNS 等都是 DNS 域名解析服务商。域名管理解析服务商变更为 CloudFlare 并不意味着域名迁移到国外 CloudFlare 上,这只是域名解析服务管理权的变动,而域名所在“域”依旧是注册购买域名的平台上,续费、变更解析服务器管理商的操作依旧要在这些平台上进行操作。
本小节以从阿里云 DNS 迁移至 CloudFlare 为例介绍主要操作方法。
首先在 CloudFlare 添加站点后,记下名称服务器 NS:
回到阿里云,进入域名控制台:
在域名列表下点击自己的站点:
在 DNS 管理下,修改 DNS 服务器:
填入刚刚记下的 NS 服务器名称:
然后点击确定即可完成操作。接下请等待较长一段时间让配置生效起来,一般 30min 左右,最长不超过 24 小时。成功后 Cloudflare 会用邮件通知你。
Cloudflare 成功接管后,会顺带「继承」几条之前配置好的 DNS 记录。如果不全,可以使用双方的导入/导出功能。
阿里云云解析中选择导出文件类型为 zone。
然后在 Cloudflare 中上传文件即可。
根据需要我们可以选择合适的代理状态(详看官方文档了解更多信息:代理状态 |Cloudflare DNS 文档)。
网站出现「重定向次数过多」问题
如果我们访问自己的博客网站出现「重定向次数过多」的问题时,修改 Cloudflare 中 SSL 加密模式为【完全】即可。
到这里,所有操作都结束了。返回阿里云云解析可以看到阿里云不再提供 DNS 解析服务:
使用 whois 工具查询注册域名的信息可以看到注册商还在阿里云:Whois.com - Domain Names & Identity for Everyone
腾讯云 CDN 加速域名中提示 CNAME 未配置正确
被 Cloudflare 代理的地址相当于套了个 CDN。对于已经在 Cloudflare 以外使用的 CDN 服务商,其 CNAME 记录可以不用被 Cloudflare 代理。即使 Cloudflare 没有代理,腾讯云 CDN 域名列表中部分加速域名会提示 CNAME 配置不正确,但实际上并没有什么问题,回源服务正常进行,这时我们可忽略该提示。
检查 CNAME 是否真的正常可以使用一些工具获取域名访问的实质 IP,如使用工具 域名解析查询(A/Txt/Cname/Mx/Srv/AAAA记录) 或 F12 控制台查看请求。将查询结果 IP 放入腾讯云 CDN 的 IP 归属查询工具中:IP归属查询 - 内容分发网络 - 控制台,如果是腾讯云 CDN 结点那么 CNAME 的解析就没什么问题。
Cloudflare 中配置重定向规则
现重定向的需求如下:
名称 | 原地址 | 重定向后地址 | 原因 |
---|---|---|---|
HTTP 重定向到 HTTPS | http://a.com |
https://a.com |
网站支持 HTTPS,需全站跳转 |
WWW 重定向到根 | https://www.a.com |
https://a.com |
提高网站可达率 |
去掉 index.html |
https://a.com/xxx/index.html |
https://a.com/xxx/ |
统一路径、维持数据统一性 |
补齐末尾斜杠 | https://a.com/xxx |
https://a.com/xxx/ |
统一路径、维持数据统一性 |
关于第三点、第四点是困扰我许久的问题。因为博客里的文章链接路径都是统一的 /p/xxxxxx/
但是搜索引擎在展示搜索结果时,文章链接总是带上 index.html
或少一个 /
。虽然页面是正常的,但是这会导致网站的评论数据或统计数据分成了两份。以前在 Nginx 上折腾不出结果,搞得都是循环重定向。现在 Cloudflare 的「重定向规则」功能可以很方便的达到我们的要求。
Cloudflare 已经内置了 HTTP 重定向到 HTTPS、WWW 重定向到根的模板,我们直接部署使用即可。至此前两个需求很快得到了解决。
对于第三个重定向,我们可以自己定一个重定向规则:
使用通配符模式即可:
但目前来看原地址后的 hashtag 以及参数在重定向过程中会被省去。我们可以通过 HTTP状态检测工具- dute.org 检测重定向路径是否符合预期:
第四个重定向规则如下:
4 条规则概览:
后记
搞网络配置时最恼人的两个东西:延迟与缓存。每一步操作都要等待一定时间后才能进行验证,因为在配置生效期间的测试结果会反复横跳(「冒险」时间长)。对于调试时期来说,缓存就如同雾气一样,拉远表象与实质之间的距离。但是如果你找到好的工具(各种在线站长工具)以及方法论(学会清缓存),整个过程就会顺畅多了。
另一个令人抓狂的点是 Cloudflare 调整重定向时,如果语法不正确它会把你之前填的内容全部清空!
最后,写完这篇文章以及与各位博主交流,我也巩固了一些网络知识,加深对课本概念的理解。
后续任务:
- 解决带 HashTag 及参数的链接重定向问题。
https://blog.uuanqin.top/p/1f2b3c/index.html#123?k=v
->https://blog.uuanqin.top/p/1f2b3c/#123?k=v
- 如果只包含查询字符串就可通过打勾相关选项解决(
241028
解决) - 带
#
后边的部分仍然会舍掉。这是个普遍的问题 Cloudflare 和腾讯云 CDN 都弄不了
- 如果只包含查询字符串就可通过打勾相关选项解决(
- 解决少一个
/
的重定向:https://blog.uuanqin.top/p/1f2b3c
->https://blog.uuanqin.top/p/1f2b3c/
(241026
解决)