关于网址路径的 301 重定向的配置
文章包含以下重定向需求的解决:
| 名称 | 原地址 | 重定向后地址 | 原因 |
|---|---|---|---|
去掉 index.html |
https://a.com/xxx/index.html |
https://a.com/xxx/ |
统一路径、维持数据统一性 |
补齐末尾斜杠 / |
https://a.com/xxx |
至于 HTTP 强转 HTTPS、WWW 重定向到根域名的配置,详见:站内文章从 HTTP 重定向到 HTTPS、从 WWW 重定向到根。
链接重写与链接重定向的区别
链接重写 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 为内置可选功能。
- 腾讯云 EdgeOne 支持 301、302 重定向。
- 多吉云 CDN 提供访问重定向功能。支持 301 重定向。
- Vercel Redirect。详看 Deploying & Redirecting Domains。
在服务器上使用反向代理进行重定向:
- Nginx。通过写一堆规则可实现部分重定向功能。详看 站内文章这篇文章。对于一些复杂路径上的重定向,博主还没能实现成功。(所以本篇文章就介绍其他方法实现复杂的路径重定向)
Cloudflare 中配置重定向规则
现重定向的需求如下:
| 名称 | 原地址 | 重定向后地址 |
|---|---|---|
去掉 index.html |
https://a.com/xxx/index.html |
https://a.com/xxx/ |
| 补齐末尾斜杠 | https://a.com/xxx |
这两点是困扰我许久的问题。因为博客里的文章链接路径都是统一的 /p/xxxxxx/ 但是搜索引擎在展示搜索结果时,文章链接总是带上 index.html 或少一个 /。虽然页面是正常的,但是:
- 网站网址不统一、不规范;
- 这会导致网站的评论数据或统计数据分成了两份(现在有解决方法了,详见 站内文章【索引】定制自己的 Waline 评论系统 相关章节)。
以前在 Nginx 上折腾不出结果,搞得都是循环重定向。现在 Cloudflare 的「重定向规则」功能可以很方便的达到我们的要求。
Cloudflare 规则
Cloudflare 中可以自己定一个重定向规则:

旧版 UI

使用通配符模式即可:

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

第二个重定向规则如下:

规则概览:

腾讯云 CDN
腾讯云 CDN 中有类似 URL 重写规则的配置「CDN 控制台」->「域名管理」->「缓存控制」,此重定向为 302 重定向。

腾讯云 EdgeOne
腾讯云 EdgeOne 中也有相应规则配置,支持自选 3XX 状态码:

规则编写方法类似 Cloudflare,但它用正则更加易写:

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





