文章包含以下重定向需求的解决:

名称 原地址 重定向后地址 原因
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,并将新链接下的资源返回给用户。但是用户对所有这些替换操作均不知情,用户浏览器中的地址不会改变。

image.png

比如阿里云 CDN、腾讯云 CDN 均提供了「重写回源 URL」的功能:

image.png

链接重写常用于隐藏源站的真实 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」的功能:

image.png

重定向常用于将旧域名的 URL 迁移、映射到新域名;或者为移动端和 PC 端提供不同的 URL。

重定向 HTTP 返回代码一般为 3XX。301 为永久重定向;302、303、307 为临时重定向。临时重定向和永久重定向的区别可以看 这篇文章

链接重定向的时机

DNS 解析链接地址的大致流程如下:

img

如果我们把上面 DNS 递归解析、迭代解析的过程拉平,并取出其中的主要结点,那么可以得到下图:

image.png

我们可以通过以下三种结点进行链接重定向。

在 NS 端重定向:

  • 阿里云/腾讯云云解析。添加一条「显性 URL 转发」的记录。但由于博主没能通过这种方式成功实现自己的目的。
  • Cloudflare 重定向规则。本文后半部分将讲述这个操作步骤。

在其他 DNS 服务中重定向:

在服务器上使用反向代理进行重定向:

  • Nginx。通过写一堆规则可实现一些简单的重定向。博主的实践经历写在 这篇文章 中。但博主对于一些复杂重定向的尝试(文章开头提到的)都没能配置成功,总是陷入循环重定向。

使用 Cloudflare 的 DNS 服务

使用 Cloudflare 的 DNS 解析服务原因有以下几点:

  1. 免费
  2. 可抵御部分 CC 攻击、DDoS 攻击
  3. 可进行重定向
  4. 数据可视化
  5. 托管后屏蔽源站 IP
  6. 国内解析速度不算慢(暂时)

目前国内网站接入 CloudFlare 一般有两种方式,分别是 DNS 接入和 CNAME 接入。这里介绍 DNS 接入方式。

DNS 接入意思就是把域名管理解析服务商变更为 CloudFlare 来管理,如国内阿里云 DNS、腾讯云 DNS 等都是 DNS 域名解析服务商。域名管理解析服务商变更为 CloudFlare 并不意味着域名迁移到国外 CloudFlare 上,这只是域名解析服务管理权的变动,而域名所在“域”依旧是注册购买域名的平台上,续费、变更解析服务器管理商的操作依旧要在这些平台上进行操作。

本小节以从阿里云 DNS 迁移至 CloudFlare 为例介绍主要操作方法。

首先在 CloudFlare 添加站点后,记下名称服务器 NS:

image.png

回到阿里云,进入域名控制台:

image.png

在域名列表下点击自己的站点:

image.png

在 DNS 管理下,修改 DNS 服务器:

image.png

填入刚刚记下的 NS 服务器名称:

image.png

然后点击确定即可完成操作。接下请等待较长一段时间让配置生效起来,一般 30min 左右,最长不超过 24 小时。成功后 Cloudflare 会用邮件通知你。

Cloudflare 成功接管后,会顺带「继承」几条之前配置好的 DNS 记录。如果不全,可以使用双方的导入/导出功能。

阿里云云解析中选择导出文件类型为 zone。

image.png

然后在 Cloudflare 中上传文件即可。

image.png

根据需要我们可以选择合适的代理状态(详看官方文档了解更多信息:代理状态 |Cloudflare DNS 文档)。

image.png

网站出现「重定向次数过多」问题

如果我们访问自己的博客网站出现「重定向次数过多」的问题时,修改 Cloudflare 中 SSL 加密模式为【完全】即可。

image.png

参考:解决使用Cloudflare出现重定向次过多问题 - 【NUTSWP】

到这里,所有操作都结束了。返回阿里云云解析可以看到阿里云不再提供 DNS 解析服务:

image.png

使用 whois 工具查询注册域名的信息可以看到注册商还在阿里云:Whois.com - Domain Names & Identity for Everyone

image.png

腾讯云 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 重定向到根的模板,我们直接部署使用即可。至此前两个需求很快得到了解决。

image.png

对于第三个重定向,我们可以自己定一个重定向规则:

image.png

使用通配符模式即可:

image.png

但目前来看原地址后的 hashtag 以及参数在重定向过程中会被省去。我们可以通过 HTTP状态检测工具- dute.org 检测重定向路径是否符合预期:

image.png

第四个重定向规则如下:

image.png

4 条规则概览:

image.png

后记

搞网络配置时最恼人的两个东西:延迟与缓存。每一步操作都要等待一定时间后才能进行验证,因为在配置生效期间的测试结果会反复横跳(「冒险」时间长)。对于调试时期来说,缓存就如同雾气一样,拉远表象与实质之间的距离。但是如果你找到好的工具(各种在线站长工具)以及方法论(学会清缓存),整个过程就会顺畅多了。

另一个令人抓狂的点是 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 解决)

本文参考