博客原文
详见我的博客原文,原文链接
问题描述
我的个人站点托管在GitHub上,想要多个域名都能够正常访问站点,比如,yunhao.space可以访问站点,blog.yunhao.space也可以访问站点。记录一次折腾。因为设置过程中,会有缓存,所以吧有的时候,不一定能够是真的能访问,所以得再三确认。
GitHub Pages
GitHub Pages提供了将项目设置成站点的功能。可以通过特定的网址访问。
GitHub Pages站点有两类,第一类是用户组织站点,第二类是项目站点。第一类站点的仓库名字必须和用户名一样,第二类站点的仓库名字可以随便。访问第一类站点网址是username.github.io
,访问第二类站点网址是username.github.io/repository_name
。
官方说,用户组织站点,每个账户只能有一个,而项目站点每个项目无限。详见官方文档
个人站点就是用户站点。
多域名绑定的官方解释
Multiple domains in CNAME file,这是官方解释:
A CNAME file can contain only one domain. To point multiple domains to the same Page, set up redirects through your DNS provider.
官方说github上的CNAME文件中只能有一个域名。我们就要另寻他法。
301重定向
于是我们想到了301重定向。为什么一定要重定向呢?
重定向可以让我们浏览器的地址栏修改url。如果只是在dns做CNAME解析的话,是没办法让地址栏修改url的。于是我们就会看到GitHub的404。
有人说了,我们可以自己定义一个404.html,然后放在个人站点的根目录下,然后404.html中用js的window.location.href重定向不就好了?
这会失败,因为这个404的错误,是github找不到你的个人站点的根目录,报的404,就是说github不知道你想访问哪个项目。
而在个人站点根目录下放404.html只能解决在这个目录下找不到某个文件什么的问题,显示404.html的内容。
所以,上边那种做法会失败。
服务器重定向
这里以Nginx服务器做例子。如果你想将域名blog.yunhao.space 301重定向到 yunhao.space的话,那么如下配置nginx的服务器:
我的服务器是Ubuntu16.04,nginx是apt-get安装的。
cd /etc/nginx/sites-available
vim redirection.conf
新建redirection.conf之后,在文件中按照下面这样写入:
server {
server_name blog.yunhao.space;
rewrite ^(.*)$ http://yunhao.space$1 permanent;
}
保存退出后,重启一下nginx服务
cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/redirection.conf redirection
systemctl stop nginx.service
systemctl start nginx.service
记得dns添加A解析,blog.yunhao.space
解析到服务器IP地址,如果不会,参考域名解析配置教程
然后等一会儿,测试一下,就成功了。这个方法可以说是最直接的,最正常的,我就是采用的这种方法。
记得设置nginx开机自启动,否则重启之后,就不能提供服务了。
GitHub多项目重定向
这个方法取自一个GitHub Pages的特性。
* 项目站点可以有自己的域名,不一定要用个人站点域名/项目名称
来访问。
解释一下,比如个人站点域名是yunhao.space
,github上有个项目站点,项目名字是test,那么在配置好GitHub Pages的情况下,可以通过yunhao.space/test
来访问。这个是官方文档中说明的。
其实GitHub Pages的项目站点域名绑定比官方说的更强大,也就是说虽然你的个人站点绑定域名是yunhao.space
,项目站点可以绑定test.yunhao.space
,甚至是test.yunhao.life
,顶级域名都可以不一样。
想要使用上边特性其实很简单,需要注意两点,第一就是dns解析和github仓库中CNAME文件相对应。第二就是github仓库开启了GitHub Pages服务。
下面我继续说这个通过多个项目站点进行重定向的方法。这个例子就正好能够反映上边这个GitHub Pages的特性。
比如现在我的yunhao.space
已经绑定了个人站点,我想让test.yunhao.life
这个域名也指向我的个人站点。
首先,dns添加CNAME解析,test.yunhao.life
解析到lmnsyunhao.github.io
如果不会,参考域名解析配置教程
然后,在github上新建一个仓库,名字比如说叫test。然后clone下来。
然后,test仓库里放一个CNAME文件,文件中写test.yunhao.life
。
然后,test仓库里放404.html的文件。文件中用js重定向。如下:注意domain变量内设置自己的想要重定向到的域名
<script>
var domain = "yunhao.space";
var src = window.location.href;
var prtc = src.substring(0, src.indexOf(':'));
var target = src.substring(src.indexOf('/', src.indexOf(':') + 3));
window.location.href = prtc + "://" + domain + target;
</script>
然后,将新增文件add, commit并push到github上master分支。
然后,开启test项目的GitHub Pages服务。如下:点击settings,然后往下滚,到GitHub Pages,然后选master,并保存。
等会儿,然后测试一下,应该就能定向了。
域名注册商重定向
有点域名注册商提供了重定向服务,比如GoDaddy,腾讯云。腾讯云的重定向,如下图:
显性URL类型就是301重定向服务,不过大家也从上边的弹窗看到了,有些限制。所以,我在GoDaddy上边找到了重定向服务。
因为我的域名就是在GoDaddy上边买的。所以我就直接设置了。我看了看,GoDaddy上边好像不能接管别的域名注册商处注册的域名。如果你是GoDaddy买的域名,那么恭喜你了。这个方法,你可以看一看,否则的话你就得看看自己的域名注册商是否提供重定向服务了。
首先登陆GoDaddy,然后点击我的产品。
比如,我们要将yunhao.life
重定向到yunhao.space
,点击DNS
如果域名服务不在GoDaddy托管的话,那么首先点击下面的域名服务器,更改回默认的来,然后等更新好了,再继续。如果没出现这种情况,继续往下看:
找到转址这一块儿。上边域名转址是处理形如yunhao.life
转到yunhao.space
的,而子域名转址是blog.yunhao.life
转到yunhao.space
的,区别是二级域名是否为空。
然后下面是域名转址的修改方式:即从yunhao.life
转到yunhao.space
如果想设置子域名转址,比如blog.yunhao.life
转到yunhao.space
,如下:
现在就设置完了,估计得等一会儿,才能生效。我等了半个多小时。这个域名注册商提供的转址服务不一定快。比如GoDaddy这个的确能转。但是速度有点儿慢。而且好像对于yunhao.life/hello.html
转到yunhao.space/hello.html
类似情况不支持。