免费的二级域名,也能搭起一个长期可用的小站

建站 · DNS · 约 8 分钟

这个站最开始只有一个免费二级域名:note.loc.cc。我先试着给根域名加 CNAME,结果 PowerDNS 返回了一个 422:

RRset note.loc.cc. IN CNAME:
Conflicts with pre-existing RRset

后来改成 A 记录,指向虚拟主机的 IPv4 地址,浏览器终于访问到了服务器。页面不是网站,而是 Apache 的 403 Forbidden。看起来像是又失败了一次,其实恰恰相反:这说明 DNS 已经工作了,请求已经真正到达了 Web 服务器。

一、先分清四个不同的问题

个人建站时,最容易混在一起的其实是四层东西:

  1. 域名:例如 note.loc.cc,它只是一个名字。
  2. DNS:负责把这个名字解析到某个目标。
  3. Web 服务器:Apache 或 Nginx,负责接收 HTTP 请求。
  4. 网站目录:真正放置 index.html、图片和脚本的地方。

如果浏览器提示域名不存在,多半是第一、二层。如果已经看到了 Apache 的错误页,说明前两层通常已经没问题了,应该继续往服务器配置和站点目录查。

错误页面本身也是信息。关键不是“有没有报错”,而是报错发生在哪一层。

二、为什么根域名的 CNAME 容易出问题

DNS 里的 CNAME 可以理解成“这个名字完全是另一个名字的别名”。问题在于,一个作为 zone 根节点的名字通常还承担 SOA、NS 等记录。CNAME 的语义又要求这个名字不要同时拥有其他类型的数据,因此根节点使用普通 CNAME 往往会发生冲突。

所以这类场景一般有三种办法:

对这个小站来说,主机明确给了 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 端口和重定向等变量。

比较稳妥的顺序是:

  1. DNS 正确解析;
  2. HTTP 能打开静态首页;
  3. 确认域名绑定和目录无误;
  4. 再申请 Let's Encrypt;
  5. 最后把 HTTP 重定向到 HTTPS。

五、免费服务也要考虑“以后怎么办”

免费域名和免费虚拟主机最大的风险,不是性能,而是可持续性。服务可能调整规则,IP 可能变化,甚至整个项目都可能停止。因此比“今天能不能打开”更重要的是:以后迁移难不难。

静态博客在这方面很有优势。只要保存好这些文件:

index.html
archive.html
about.html
assets/
posts/

换主机时,本质上只是重新上传,然后改一条 DNS 记录。内容属于自己,结构也透明。

给未来的自己:至少保留一份本地压缩包;如果文章越来越多,再考虑用 Git 管理版本。

六、一个小站真正重要的东西

搭站的时候很容易把时间花在主题、框架、统计、评论系统和各种“以后可能会用到”的功能上。但如果站点长期没有文章,这些东西其实都没有意义。

所以我现在更愿意把网站理解成一叠可以公开访问的文本文件:先让写作和记录成立,再慢慢加功能。技术应该服务于内容,而不是让内容变成技术项目的附件。