---
title: "Markdown 镜像"
description: "这个网站每个页面都有一份同路径的 .md 副本，让 AI 客户端直接读内容，而不用先解析版式。"
canonical: https://yonnia.com/projects/markdown-mirrors
language: zh
status: active
year: 2026
stack: ["Node.js"]
---
# Markdown 镜像

这个网站每个页面都有一份同路径的 .md 副本，让 AI 客户端直接读内容，而不用先解析版式。

这个网站任何一个 URL 后面加 `.md`，都能拿到同一个页面的纯 Markdown 版本。每页页脚都有那个链接。

## 它解决的问题

真正重要的流量里，越来越大的一部分不是浏览器，而是一个模型抓取页面来回答问题。这个客户端要付我整套版式的成本——导航、页脚、面包屑、结构化数据——才能拿到它唯一想要的东西，也就是正文。

镜像就是同样的内容去掉外壳：front matter 里放 canonical URL 和日期，然后是正文。它和 HTML 由同一份源文件在同一次构建里生成，所以不可能不同步。

## 唯一值得解释的决定

想让镜像不进搜索结果，最直觉的做法是在 robots.txt 里写 `Disallow: /*.md$`。这是错的，我一开始就是这么写的，后来才发现。

`Disallow` 拦的是**抓取**。它会正好拦住这些文件存在的意义所在的那些 agent，同时并没有做任何 `noindex` 做不到的事。搜索引擎本来也不会索引它们，而 AI 客户端会从一个专门为它们生成的文件那里拿到一个近似 403 的结果。

正确的工具是给 `/*.md` 加一个 `X-Robots-Tag: noindex, nofollow` 响应头，也就是 Cloudflare Pages 的 `_headers` 文件里做的事。文件保持可抓取，同时不进索引。「能不能读」和「该不该出现在结果里」是两个问题，各用一条指令。

## 顺带

根目录的 `/llms.txt`：一份纯文本索引，列出每个页面和它的描述，让 agent 不用爬站就能看到全貌。
