免费的二级域名,也能搭起一个长期可用的小站
这个站最开始只有一个免费二级域名:note.loc.cc。我先试着给根域名加 CNAME,结果 PowerDNS 返回了一个 422:
RRset note.loc.cc. IN CNAME:
Conflicts with pre-existing RRset
后来改成 A 记录,指向虚拟主机的 IPv4 地址,浏览器终于访问到了服务器。页面不是网站,而是 Apache 的 403 Forbidden。看起来像是又失败了一次,其实恰恰相反:这说明 DNS 已经工作了,请求已经真正到达了 Web 服务器。
一、先分清四个不同的问题
个人建站时,最容易混在一起的其实是四层东西:
- 域名:例如
note.loc.cc,它只是一个名字。 - DNS:负责把这个名字解析到某个目标。
- Web 服务器:Apache 或 Nginx,负责接收 HTTP 请求。
- 网站目录:真正放置
index.html、图片和脚本的地方。
如果浏览器提示域名不存在,多半是第一、二层。如果已经看到了 Apache 的错误页,说明前两层通常已经没问题了,应该继续往服务器配置和站点目录查。
错误页面本身也是信息。关键不是“有没有报错”,而是报错发生在哪一层。
二、为什么根域名的 CNAME 容易出问题
DNS 里的 CNAME 可以理解成“这个名字完全是另一个名字的别名”。问题在于,一个作为 zone 根节点的名字通常还承担 SOA、NS 等记录。CNAME 的语义又要求这个名字不要同时拥有其他类型的数据,因此根节点使用普通 CNAME 往往会发生冲突。
所以这类场景一般有三种办法:
- 如果虚拟主机给了固定 IPv4,就直接用 A 记录;
- 如果 DNS 提供商支持 ALIAS/ANAME,可以用它实现“类似根域名 CNAME”的效果;
- 把真正的 CNAME 放在子域名,例如
www.note.loc.cc。
对这个小站来说,主机明确给了 IPv4,所以 A 记录反而是最直白的方案:
@ A 103.213.4.44
三、看到 403,反而应该高兴一点
浏览器访问 http://note.loc.cc 后,Apache 返回 403。这说明至少发生了下面这条链路:
note.loc.cc
↓ DNS
103.213.4.44
↓ HTTP
Apache
↓
站点目录 /
如果站点目录里没有首页文件,而服务器又禁止目录列表,就会得到 403。此时上传一个最小的 index.html,往往立刻就能看到页面。
<!doctype html>
<meta charset="utf-8">
<title>note.loc.cc</title>
<h1>It works.</h1>
这类测试页面很有价值,因为它把变量减少到了最少:不需要 PHP,不需要数据库,也不需要框架。如果纯 HTML 能正常打开,说明虚拟主机、域名绑定和 DocumentRoot 基本都通了。
四、接下来才轮到 HTTPS
很多人习惯一上来就开 HTTPS,但我更喜欢先让 HTTP 正常。原因很简单:HTTPS 还会再引入证书签发、域名验证、443 端口和重定向等变量。
比较稳妥的顺序是:
- DNS 正确解析;
- HTTP 能打开静态首页;
- 确认域名绑定和目录无误;
- 再申请 Let's Encrypt;
- 最后把 HTTP 重定向到 HTTPS。
五、免费服务也要考虑“以后怎么办”
免费域名和免费虚拟主机最大的风险,不是性能,而是可持续性。服务可能调整规则,IP 可能变化,甚至整个项目都可能停止。因此比“今天能不能打开”更重要的是:以后迁移难不难。
静态博客在这方面很有优势。只要保存好这些文件:
index.html
archive.html
about.html
assets/
posts/
换主机时,本质上只是重新上传,然后改一条 DNS 记录。内容属于自己,结构也透明。
六、一个小站真正重要的东西
搭站的时候很容易把时间花在主题、框架、统计、评论系统和各种“以后可能会用到”的功能上。但如果站点长期没有文章,这些东西其实都没有意义。
所以我现在更愿意把网站理解成一叠可以公开访问的文本文件:先让写作和记录成立,再慢慢加功能。技术应该服务于内容,而不是让内容变成技术项目的附件。