通过js或者nginx实现域名重定向

大学的时候买了 windliang.cc 的域名当做自己的博客,然后一直使用的是 githubpages 服务。最近国内访问 github 有些慢,想把博客迁移到阿里云的服务器上。

之前已经把刷题博客 leetcode.wang 通过 nginx 成功放到阿里云上了,参考 云服务器搭建网站全过程

但是大学买的 .cc 域名有一个最大的问题,现在不能备案了,不能备案的话就不能放到国内服务器上。于是前段时间又买了一个 windliang.wang 域名,备案成功后,按照之前的总结,很快就放到了阿里云上。

现在需要做的是当访问 .cc 域名的时候,重新定向到 .wang 域名上。

有两种方式,一种是在前端通过 js 进行重定向,另一种就是在后端通过 nginx

通过 js

因为 .cc 域名没有备案,所以我们需要在国外的服务器上放一个 html 来实现重定向。

最简单的方法,就是依旧使用 githubpages 服务。需要的index.html 写法如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
var domain = "windliang.wang";
//得到 https://windliang.cc/XXXXX
var src = window.location.href;

//得到 https
var prtc = src.substring(0, src.indexOf(':'));

//得到 /XXXXX
//indexOf 的第二个参数是开始查找的位置
var target = src.substring(src.indexOf('/', src.indexOf(':') + 3));

//组合在一起
//https://windliang.wang/XXXXX
window.location.href = prtc + "://" + domain + target;
</script>

比较好理解,上边也都注释了。

我们只需要把它保存为 index.html 然后放到 github 仓库里。

Settings 里开启 pages 服务,并且绑定我们的域名。

并且在自己的 DNS 里面添加一个 CNAME 记录,将域名解析到 wind-liang.github.io

然后再去打开 windliang.cc 的任意地址,就会自动跳转到 windliang.wang 了。

这样就成功实现域名的重定向了。但这样做的话,可能对搜索引擎不是很友好,我也没研究过 SEO,仅仅是我的猜测。下边再介绍通过 nginx 方式的重定向。

但是这里有一点我不能理解的是,访问 windliang.cc 的时候会有一个 404 的状态码,这里我也不知道是为什么,如果谁知道的话可以告诉我。

通过 nginx

因为原来的域名没有备案,所以你需要一个国外的服务器,我的服务器操作系统是 Debian

对于 http 的重定向很简单,只需要在 /etc/nginx/conf.d 文件夹下新建一个配置文件。

1
vim /etc/nginx/conf.d/windliang.cc.conf

然后添加下边的内容。

1
2
3
4
5
server {
listen 80;
server_name windliang.cc;
return 301 https://windliang.wang$request_uri;
}

这样的话就可以了。但因为监听的是 80 端口,所以只会对 http://windliang.cc 进行重定向,对于 https 的链接就无能为力了。

所以我们还需要为 windliang.cc 申请一个 SSL 证书,从而完成 https 的跳转。

需要知道两个东西。

Let’s Encrypt

Let’s Encrypt由互联网安全研究小组(缩写ISRG)提供服务。主要赞助商包括电子前哨基金会Mozilla基金会Akamai以及思科。2015年4月9日,ISRG与Linux基金会宣布合作。[5]

用以实现新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。[6]GitHub上有这一规范的草案,[6][7]且提案的一个版本已作为一个Internet草案发布。[8]

Let’s Encrypt宣称这一过程将十分简单、自动化并且免费。[9]

Certbot

Certbot is a free, open source software tool for automatically using Let’s Encrypt certificates on manually-administrated websites to enable HTTPS.

Certbot is made by the Electronic Frontier Foundation (EFF), a 501(c)3 nonprofit based in San Francisco, CA, that defends digital privacy, free speech, and innovation.

是一个可以帮我们自动获取证书的软件。我们可以在 官网 选择自己的后端软件以及操作系统,它会列出我们需要操作的步骤。

然后就会出现下边的步骤,我只截了一部分图。

首先是安装 Certbot

1
sudo apt-get install certbot python-certbot-nginx

有两种获得证书的方式,一种是自动获取证书并且配置 nginx ,一种是仅获取证书。因为我的网站是在阿里云上,不在这个服务器上,所以我采用仅获取证书的方式。

运行之前,要把之前的 CNAME 记录删除,添加一个 A 记录,将域名指向当前服务器的 ip

然后执行下边的命令。

1
sudo certbot certonly --nginx

执行过程中会让你填邮箱,选择域名,然后等几秒钟就生成成功了,记住最后输出的证书的地址和密钥的地址。

更改之前的配置文件。

1
vim /etc/nginx/conf.d/windliang.cc.conf

80 端口和 443 端口合在一起,然后将上边保存的证书和密钥地址填上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 80;
listen 443 ssl;
server_name windliang.cc;
ssl_certificate /etc/letsencrypt/live/windliang.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/windliang.cc/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 将80端口的http请求 301 重定向到新域名
if ( $scheme = "http" ) {
return 301 https://windliang.wang$request_uri;
}

# 将443端口的https请求 rewrite 重定向到新域名
location / {
rewrite ^(.*)$ https://windliang.wang$1 permanent;
}
}

然后,就会发现可以得到 301 的状态码了。

最后一步,仔细看之前得到证书的截图,会发现证书的有效期是 3 个月。但没有关系,教程说如果通过上边的步骤走的话,到期前它会自动帮我们更新。

我也不敢确定,只能到时候看它有没有更新了,哈哈。

以上就是域名重定向的过程了,主要是前端通过 js 和后端通过 nginx

上边流程看起来很流畅,但今天用 nginx 做重定向的过程相当曲折了。因为一开始我只对 80 端口做了重定向,当我在浏览器输入 windliang.cc 的时候,因为之前是通过 https 访问的,所以浏览器会自动在前边加上 https:// ,所以导致一直不能成功跳转。

最神奇的是不知道为什么中午吃饭前有一次跳转成功了,然后吃完饭回来心想再放个网站到服务器,毕竟国外服务器的话,域名就不需要备案了,但是突然发现 windliang.cc 不能跳转了。

然后自己就各种尝试,一直以为是 nginx 的原因,各种看日志,重启 nginx,但始终没找到问题,把 nginx 重装了两遍,甚至想把服务器重装了,最最后,终于意识到了这个 https 的问题,才想到了上边的解决方案。

windliang wechat