8 月 4 日早上的一串提交,主题是把博客配置里的敏感值清出去:百度/Bing 的推送 token、LLM 打标签的 api_key、文章加密分类的口令,全部移进 .gitignore 的 _config.local.yml,仓库里只留一份 _config.local.example.yml 模板。

同一天还做了三件相关的事:评论系统从 Twikoo+Waline 换成 Artalk、版权协议从 CC BY-NC-SA 4.0 改成 CC BY 4.0、给 AI 爬虫放行并生成 llms.txt。这篇记配置分层的代价,顺带记 GEO 和署名这两件。

去敏不是把值删掉

_config.yml 是公开的,密钥写在里面等于公开。但 Hexo 构建又需要真值,所以做法是分层:

# _config.local.example.yml(进仓库)
hexo_submit_urls_to_search_engine:
  baidu_token: ""
  bing_token: ""
llm_tagging:
  api_key: ""
encrypt:
  categories:
    - { name: 加密, password: "" }

复制成 _config.local.yml 填真值,构建时用 --config _config.yml,_config.local.yml 深度合并。build / server / dev / push 四个脚本全部内置合并参数。

好处很直接:仓库里没有真值,模板告诉下一个人要填什么。坏处也很直接:每条命令都得记得带第二份配置,漏了不是报错,是静默降级。

漏带的两个方向

第一个方向是构建直接失败。llm_tagging 的 api_key 挪走以后,_config.yml 里只剩一个空的父键,hexo clean 不带 --config 会在空配置上报错。所以 clean 和 dev 里的 hexo clean 也补上了合并参数——连「清理」这种看起来跟配置无关的命令都得带上。

第二个方向更隐蔽:encrypt.categories 的口令漏带,构建不会失败,加密分类的文章直接以明文输出。所以 _config.yml 的 encrypt 块旁边留了一行警告:

# ⚠ 不带 _config.local.yml 合并构建时,加密分类的文章会以明文输出

失败方向为「泄露」的配置,比失败方向为「报错」的配置危险得多。 前者需要人主动去看,后者至少会红。

GEO 那部分

同一天还做了:robots.txt 显式放行 GPTBot、OAI-SearchBot、ClaudeBot、PerplexityBot、Google-Extended、CCBot 等主流 AI 爬虫,并指向 llms.txt 和两个 sitemap;新增 scripts/llms-txt.js,构建时生成 /llms.txt。

生成器按首个分类分组,每篇一行 - [标题](绝对URL): 摘要,摘要会剥掉代码块、HTML、Markdown 记号,截到 100 字。两个边界值得一提:

  • 加密文章不进 llms.txt,避免摘要泄露。hexo-blog-encrypt 处理后会从 post 对象删掉 password,所以必须回读源文件 frontmatter 判断,不能信内存对象;
  • 单篇可以在 front-matter 写 llms: false 退出。

sitemap 那边试过 hexo-generator-seo-friendly-sitemap 的索引式拆分,两分半后就回滚成官方 hexo-generator-sitemap 了:站点才 80 来篇,拆 post/page/category/tag 分表收益太小,官方插件维护还更活跃。llms.txt 和 robots 的改动保留。

署名和协议

同样是那天,7 篇 AI 起草的文章统一加了 copyright_author: Claude Opus 4.8 和 copyright_author_href,版权框的「文章作者」会显示协作方,而不是只显示我。

版权协议则从 CC BY-NC-SA 4.0 改成 CC BY 4.0:署名,允许商用和演绎。改的时候想清楚了一件事——博客里不少东西本来就是从客户端语料、官方文档和各处资料里整理出来的,非商业限制带来的摩擦大于收益。

收尾

配置分层之后,公开仓库确实干净了,但系统的默认状态也变了:以前「直接 hexo g」是能构建出正确站点的,现在必须记得合并。所有入口都写进脚本只是把这件事变成默认,没法变成自动——克隆仓库的新人仍然要先 cp 模板、填值。

如果哪天再有人问「为什么不能直接把密钥写回 _config.yml」,答案不是「不安全」三个字,而是:公开的配置和能构建的配置,从现在起是两份东西了。