摘要生成中...
AI 摘要
Hunyuan-lite
文章推荐:在 DNS 侧配置重定向

本文侧重于 从 HTTP 重定向到 HTTPS、从 WWW 重定向到根,对于路径的重定向,可详看这篇文章:站内文章关于网址路径的 301 重定向的配置

今天填了一个一直想填的坑,就是把博客域名的重定向、CDN 回源设置给弄好和捋顺了。以前的做法是 www.uuanqin.topuuanqin.top 同时使用,CDN 也配置两条域名,但我总感觉不优雅、也不安全。通过学习一些网络相关知识,我自己尝试动手实验,绘制了域名解析流程图(把 DNS 迭代查询和递归查询简化拉平了)。此外把一些关键的具体配置分享出来并简要分析。

萌新站长们推荐先熟悉以下文章

如果你是萌新站长,建议不要直接上手本篇文章内容,先弄明白这几篇文章循序渐进开始:

  1. 拥有了域名,配置主机 A 记录,直接指向源站:新手引导 (aliyun.com)
  2. 使用 CDN 服务,并加速域名:内容分发网络 CDN 从零开始配置 CDN-快速入门-文档中心-腾讯云 (tencent.com)
  3. 网站使用 HTTPS:SSL 证书使用指南 (aliyun.com)

相关技术概念解析

301 重定向的优点(www 重定向到不带 www 的地址)

你会发现互联网上一些网站的输入 www 开头网址跳转后,地址栏 www 会消失(或相反:不输 www 反而跳到显示 www,例如 baidu.com)。它们都使用了一种非常重要的「自动转向」技术——301 重定向。

301 重定向(301 Move Permanently),指页面永久性转移,表示为资源或页面永久性地转移到了另一个位置。301 是 HTTP 协议中的一种状态码,当用户或搜索引擎向服务器发出浏览请求时,服务器返回的 HTTP 数据流中头信息(Header)中包含状态码 301 ,表示该资源已经永久改变了位置。

过程如图:

sequenceDiagram
    participant Client
    participant Server

    %% 左侧外部注释
    note left of Client: Initial request
    Client->>Server: GET /doc HTTP/1.1
    
    %% 左侧第二段注释
    note right of Server: Resource moved.<br/>New location returned
    Server-->>Client: 301 Moved Permanently<br/>Location: /doc_new
    
    note left of Client: Request to the new location

    Client->>Server: GET /doc_new HTTP/1.1
    Server-->>Client: 200 OK

    %% 右侧外部注释(放在图外)
    
    note right of Server: Resource returned.

利用 301 重定向设置网站别名有利于网站首选域的确定,对于同一资源页面多条路径的 301 重定向有助于 URL 权重的集中,利于网站 SEO。

302 重定向(302 Move Temporarily),指页面暂时性转移,表示资源或页面暂时转移到另一个位置,常被用作网址劫持,容易导致网站降权,严重时网站会被封掉,不推荐使用。

搜索引擎是这样对待两种重定向的:

重定向方式 搜索引擎抓取操作
301 页面永久性转移 抓取新内容的同时也将旧的网址替换成重定向之后的网址
302 页面暂时性转移 抓取新的内容而保存旧的网址并认为新的网址只是暂时的

HTTP 跳转到 HTTPS

HTTP 协议也就是超文本传输协议,是一种使用明文数据传输的网络协议,不提供任何方式的数据加密。如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。

为了数据传输的安全,另一种协议 HTTPS(安全套接字层超文本传输协议)诞生。HTTPS 在 HTTP 的基础上加入了 SSL/TLS 协议,SSL/TLS 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTP 和 HTTPS 使用的是完全不同的连接方式,同时使用的端口也不同,网络模型工作层不同:

协议 传输方式 端口 工作层
HTTP 超文本传输协议 明文传输 80 应用层
HTTPS 安全套接字层超文本传输协议 SSL/TLS 协议加密 443 传输层

HTTPS 有利于搜索排名的提升。百度和谷歌两大搜索引擎都已经明确表示,HTTPS 网站将会作为搜索排名的一个重要权重指标。也就是说 HTTPS 网站比起 HTTP 网站在搜索排名中更有优势。

为什么使用 CDN?

当用户直接访问源站中的静态内容时,可能面临的体验问题:

  • 客户离服务器越远,访问速度越慢。
  • 客户数量越多,网络带宽费用越高。
  • 跨境用户访问体验较差。

image.png

CDN 如何改善您的网络体验:

  • CDN 缓存内容后,用户仅需要访问就近的 CDN 节点即可获取静态内容。
  • 缓解源站带宽压力,网络费用更低。
  • 分布全球的跨境节点提升跨境访问体验。

image.png

为什么不要用 CDN?

CDN 增加网站的被攻击风险,若安全措施没有实施到位,容易产生高额账单。比如在 2024 年,本站遭遇大量恶意攻击并造成一定程度的财产损失。

HSTS 是什么?

上文提到 HTTPS 可以提高安全性,是「更加安全的 HTTP」,但 HTTPS 提供服务也不是安全的。

最初网站是通过 HTTP 协议提供服务,为了安全起见,网站升级为 HTTPS 协议,可是当用户在浏览器中输入网址时,例如 www.uuanqin.top ,而不是输入完整的 www.uuanqin.top ,浏览器会向网站发起一次 HTTP 请求,这时浏览器获取到一个重定向到 HTTPS 的请求(就像上文我们说的 301 重定向),然后再使用 HTTPS 协议通信。在这个过程中,我们使用了一次明文的 HTTP 请求和重定向,而这个过程很容易被攻击者利用,攻击者可以以中间人的方式劫持这次请求,从而进行后续的攻击,例如窃听数据,篡改请求和响应,跳转到钓鱼网站等。

为了避免这个问题,我们希望浏览器做到:当用户输入网址时(不带 https:// )将其转换成 HTTPS 请求,从而绕过明文的 HTTP 请求和重定向。我们使用 HSTS 可以告诉浏览器这个网站是否是使用的 HTTPS。

HSTS 的全称是 HTTP Strict-Transport-Security,它是一个 Web 安全策略机制。HSTS 的核心是HTTP 响应头(HTTP Response Header),它告诉浏览器在接下来的一段时间,这个域名只能通过 HTTPS 进行访问,如果该域名在浏览器中出现不安全访问,HSTS 会强制用户的访问。

HSTS Header 中可以设置其过期时间,比如 1 年。注意如果网站 SSL 证书出现问题,那么用户在一年的时间里都没法正常访问你的网站了,当然,除非用户清除了浏览器缓存。

HSTS 也并不安全。假设浏览器中没有该域名的 HSTS 信息时,用户第一次访问该网站时,依然需要使用明文的 HTTP 请求和重定向,解决方法是 Preload List,感兴趣的同学可以自己搜索,这里就不再赘述。

网址的转换过程

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

img

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

准备工作

配置效果与原因

我们的总目标是:从 HTTP 重定向到 HTTPS、从 WWW 重定向到根。拆开来说,就是要实现这样效果:

  1. 用户在地址栏输入 www.uuanqin.top 时会直接重定向到 uuanqin.top,地址栏不显示 www 地址;
  2. 所有 HTTP 不安全链接自动指向 HTTPS 链接,地址栏中的地址会自动转换成 HTTPS。

更多的要求为:

  1. 使用 HSTS 在尽可能保证安全的同时减少重定向次数

网址转换过程

操作

这一章节就是操作环节,把上一章节的内容变为现实。重新回顾一下我们的目标:从 HTTP 重定向到 HTTPS、从 WWW 重定向到根

作为新站长,一口气配置正确是不可能的,我们可以将目标简要拆解成以下三个配置任务:

配置任务编号 用户输入 地址栏变成
A http://uuanqin.top https://uuanqin.top
B http://www.uuanqin.top
C https://www.uuanqin.top
Z https://uuanqin.top

每一个配置任务代表一种处理流程,处理流程可以在 Nginx、域名解析商、边缘加速产品等各个地方进行配置。

纯 Nginx 完成

在这一章节中,我们将所有的请求打到服务器上的 Nginx,通过对 Nginx 配置实现我们的目标。使用到的服务和软件:

DNS 域名解析 Web 服务
阿里云 Nginx 1.22.1

首先配置好 DNS:

主机记录 记录类型 记录值
@ A 服务器地址
www
为什么 www 域名不使用 CNAME 指向根,从而减少配置?

CNAME 不能达到「用户浏览器只显示无 www 网址」的目的,不能做到用户无感知。

配置任务 Z:提供最终目的地的访问入口

这个配置任务主要为 Nginx 配置好最终目的地,因为用户访问地址是要获取数据的。下面的配置就说明了数据将从服务器的哪个地方来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
#填写证书绑定的域名
server_name blog.uuanqin.top;
access_log /var/log/nginx/host.access.log alogformat; # main;

include /etc/nginx/conf.d/basic_protection_conf/block_spiders.conf;

location / {
root /var/www/blog.uuanqin.top;
index index.html index.htm;
}

error_page 404 /pages/404.html;

listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/blog.uuanqin.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.uuanqin.top/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

add_header Strict-Transport-Security "max-age=3001";
}

HSTS 配置:add_header Strict-Transport-Security "max-age=3001";,解释:

  • 添加一个名为 Strict-Transport-Security 的 HTTP 响应头,并设置了 HSTS 的相关选项
  • max-age 是必选参数,是一个以秒为单位的数值,它代表着 HSTS Header 的过期时间
  • includeSubDomains 是可选参数,如果包含它,则意味着当前域名及其子域名均开启 HSTS 保护
  • preload 是可选参数,只有当你申请将自己的域名加入到浏览器内置列表的时候才需要使用到,指示浏览器将网站添加到 HSTS 预加载列表中,以便所有浏览器都将始终使用 HTTPS 与网站建立连接。

配置任务 A:HTTP 转 HTTPS

配置 301 重定向:

1
2
3
4
5
6
7
8
server {
listen 80;
#填写证书绑定的域名
server_name uuanqin.top;

#将所有HTTP请求通过rewrite指令重定向到HTTPS。
rewrite ^(.*) https://uuanqin.top$1 permanent;
}

301 重定向关键:rewrite ^(.*) https://uuanqin.top$1 permanent;

配置任务 B:监听 80 端口,从 WWW 重定向到根,顺便转为 HTTPS

将 http: //www. uuanqin.top 重定向到 https: //uuanqin.top,完成任务 b.

1
2
3
4
5
6
7
8
9
# 首次访问
server {
listen 80;
#填写证书绑定的域名
server_name www.uuanqin.top;

#将所有HTTP请求通过rewrite指令重定向到HTTPS。
rewrite ^(.*) https://uuanqin.top$1 permanent;
}

配置任务 C:监听 443 端口,从 WWW 重定向到根

将 https: //www. uuanqin.top 重定向到 https: //uuanqin.top,完成任务 c.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
#HTTPS的默认访问端口443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
listen 443 ssl;

#填写证书绑定的域名
server_name www.uuanqin.top;

rewrite ^(.*) https://uuanqin.top$1 permanent;

#填写证书文件名称
ssl_certificate conf.d/cert/www.uuanqin.top.pem;
#填写证书私钥文件名称
ssl_certificate_key conf.d/cert/www.uuanqin.top.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

#默认加密套件
ssl_ciphers HIGH:!aNULL:!MD5;

#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

#表示优先使用服务端加密套件。默认开启
ssl_prefer_server_ciphers on;

#HSTS配置
add_header Strict-Transport-Security "max-age=3001";
}

小结

单单 Nginx 就可以把所有的配置任务完成,网站也能成功运作了。目前我们的过程如下:

当然,在有些情况下,你可以将部分配置任务交给其他服务商完成。

请继续阅读下面的章节。

腾讯云 CDN

配置任务 A:HTTP 转 HTTPS

这一部分靠腾讯云边缘结点完成的(CDN)。首先我们在 DNS 解析设置了这两条记录,以使用 CDN 服务 [1]

主机记录 记录类型 记录值
@ CNAME CDN 结点地址
为什么不在 CDN 同时设置两个加速域名?如 www.uuanqinuuanqin.top

很长一段时间以来一直都是这样设置,但是我觉得每次刷新都要同时刷新两个域名很不优雅,且耗费更多回源流量。此外还无法设置 301 重定向,造成 www 与不含 www 的域名同时存在。

在 CDN 加速域名 uuanqin.top 设置中的 HTTPS 配置例,开启 301 强制跳转和 HSTS:

image.png

到此则完成了任务 A.

如果任务 B、C、Z 保持在 Nginx 端配置的话,解析流程如图所示:

image.png

过程图解析:

浏览器有无 HSTS 缓存 地址栏协议头 地址栏路径 路径
http:// uuanqin.top 腾讯云 CDN 将其重定向至 HTTPS 再访问 CDN 边缘节点,同时浏览器存储 HSTS 缓存
浏览器直接转换成 HTTPS 访问 CDN
不关心 https:// 直接访问 CDN
http:// www.uuanqin.top 直接访问到服务器主机,Nginx 重定向至 https://uuanqin.top 进行访问。过程中浏览器会存储 HSTS 缓存
浏览器直接转换成 HTTPS,并直接访问到服务器主机,Nginx 重定向至 https://uuanqin.top 进行访问
不关心 https:// 直接访问到服务器主机,Nginx 重定向至 https://uuanqin.top 进行访问

其中 uuanqin.top 为 CDN 加速域名(即使用了 CDN 加速的网站域名)。通常第一次访问时没有 HSTS 缓存。

腾讯云 EdgeOne

配置任务 A:HTTP 转 HTTPS

同样的 EdgeOne 也有相应配置:

image.png

Cloudflare

Cloudflare 在 DNS 解析端就提供了基本的重定向服务。

image.png

image.png

配置完成后,过程图如下:

image.png

其他操作提示

清除浏览器(Chrome、Edge)的 HSTS 307 缓存

配置 HSTS 后我们可以打开浏览器开发者工具,监视网络中包发送情况即可。有时候我们也需要清除 HSTS 的缓存。

Chrome 浏览器打开 chrome://net-internals/#hsts (Edge 浏览器直接点这个链接也没问题,它会自动重定向)

先在 Query HSTS/PKP domain 查你被 307 Internal Redirect 的域名

  • 如果是 Not Found,这个就不是你要的答案
  • 如果有內容,如下图,那就到 Delete domain security policies 输入你被 307 Internal Redirect 的网址,然后 Delete 它。

image.png

现在你能使用 HTTP 访问该网址了。

Nginx 安装配置

可参考这篇文章:站内文章Nginx 的安装与反向代理配置

百度站长

弄好之后可以在百度站长弄个 HTTPS 认证,测试自己的成果。

image.png

在 Cloudflare DNS 配置重定向

详看这篇文章:站内文章关于网址路径的 301 重定向的配置。也是 301 链接重写,不过文章更侧重于路径改写。

本文参考


  1. 内容分发网络 CDN 从零开始配置 CDN_腾讯云 ↩︎