..

使用 Nginx 将旧域名 301 重定向至主域名

·

最近才注意到,我的主域名 afark.cn 一直闲置着,就花了半天时间将其指向我的 GitHub Pages 站点,作为我的博客站点,也与备案情况保持一致。为了避免重复修改在多个地方的配置,我同时将旧域名 psy.afark.cn 301 重定向到 afark.cn。在这个过程中,了解到的 301 重定向这个操作。还是挺有意思的。

目标:

https://psy.afark.cn
        ↓ 301
https://afark.cn
GitHub Pages

其中:

  • afark.cn:GitHub Pages 的正式域名
  • psy.afark.cn:旧兼容域名
  • VPS:负责 301 跳转
  • Nginx:执行重定向
  • Certbot:提供 HTTPS 证书

1. DNS 配置

在 DNSPod 中,将原来的:

psy    CNAME    jiangxy98.github.io.

改为:

psy    A    VPS_IP

其中 VPS_IP 为 VPS 的静态公网 IP。

同时确保不存在:

psy    CNAME    ...
psy    AAAA     ...

检查:

dig +short A psy.afark.cn
dig +short CNAME psy.afark.cn
dig +short AAAA psy.afark.cn

最终应为:

VPS_IP

后两条无输出。

2. 配置 Nginx

在 VPS 上新建 Nginx 配置文件:

sudo vim /etc/nginx/sites-available/psy.afark.cn

写入:

server {
    listen 80;
    listen [::]:80;
    server_name psy.afark.cn;
    return 301 https://afark.cn$request_uri;
}

启用:

sudo ln -s /etc/nginx/sites-available/psy.afark.cn \
  /etc/nginx/sites-enabled/psy.afark.cn

检查并重载:

sudo nginx -t
sudo systemctl reload nginx

3. 配置 HTTPS

仍然是在 VPS 上进行操作,安装并运行 Certbot 配置自动更新的 SSL 证书:

sudo certbot --nginx -d psy.afark.cn

成功后证书位于:

/etc/letsencrypt/live/psy.afark.cn/

使用 Certbot 还有一个好处,就是会自动配置续期。

检查自动续期:

sudo certbot renew --dry-run

4. 验证跳转

通过任意可以访问的设备或浏览器测试首页:

在终端上运行:

curl -I https://psy.afark.cn

应看到:

HTTP/2 301
location: https://afark.cn/

测试路径和参数:

curl -I 'https://psy.afark.cn/test/?a=1'

应跳转到:

https://afark.cn/test/?a=1

或通过浏览器访问 https://psy.afark.cn/test/?a=1,应跳转到 https://afark.cn/test/?a=1

5. 最终架构

psy.afark.cn
DNSPod
AWS Lightsail
Nginx 301
afark.cn
GitHub Pages

如此操作以后 afark.cn 是唯一正式站点域名,而旧域名 psy.afark.cn 作为兼容旧链接的永久重定向入口。