文章
一条命令,把内部文档发上了公网
约 1073 字 · 阅读约 3 分钟
建站记录 · 本文有 AI 参与整理,文中的操作与环境对应写作当时的版本。
第一次把网站发上线的时候,部署命令是这样的:
npx wrangler pages deploy .
(这条命令出自 Cloudflare Pages 的直传部署。)
. 代表当前目录。命令跑完,网站正常打开,我也就没再看它。
#问题是怎么暴露的
后来发现:整个项目目录都被传上去了。也就是说,下面这些地址在公网上可以直接打开:
https://king0flight.com/部署说明.md
https://king0flight.com/avatar.png
部署说明里有 Cloudflare 账户 ID、DNS 记录、凭据文件的位置。虽然里面没有密码,但把这些东西挂在公网上,无论如何都不该发生。
#为什么 .assetsignore 没用
最容易想到的办法是加一个 .assetsignore,把内部文件排除掉。
它不生效。.assetsignore 是 Workers 静态资源那一套的机制,Cloudflare Pages 不读它。对 Pages 来说,你传上去什么,它就发什么。
#改法:改成白名单,而不是黑名单
真正管用的做法是把结构改掉:
personal-website/
├── public/ ← 只发这个目录
│ ├── index.html
│ ├── css/
│ ├── js/
│ └── ...
├── blog/ ← 博客源文件,不发布
├── tools/ ← 生成脚本,不发布
├── tests/ ← 测试,不发布
└── 部署说明.md ← 内部文档,不发布
部署命令随之变成:
npx wrangler pages deploy public --project-name king0flight --branch main
黑名单的思路是"我记得排除哪些",白名单的思路是"只有这些能出去"。前者会漏,后者不会。
#怎么验证
改完不能只看首页能不能打开,要专门请求那几个内部路径,检查两件事:
- 状态码和
Content-Type:内部文档现在返回的是站点的 HTML 回退页(text/html),不是text/markdown - 正文里搜关键词:账户 ID、凭据路径这些字符串一处都不该出现
这一步现在成了固定动作:每次发布后 curl 一遍内部路径。看起来有点多余,但它只需十秒。
#一个遗留问题
已经发出去的资源会被 Cloudflare 边缘缓存,非 HTML 资源的默认缓存是七天。所以在切换后的短时间内,裸域上那两个地址还可能返回旧内容;www 和 pages.dev 域是即时干净的。
急不来,等它过期。
#留下的习惯
发布目录永远显式写出来,不用 .。多打十几个字符,换掉一整类事故。
留言
评论区还没开。想聊两句的话,写封信给我,可以直接交流。