返回首页 King0fLight

文章

一条命令,把内部文档发上了公网

目录
  1. 问题是怎么暴露的
  2. 为什么 .assetsignore 没用
  3. 改法:改成白名单,而不是黑名单
  4. 怎么验证
  5. 一个遗留问题
  6. 留下的习惯

建站记录 · 本文有 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 域是即时干净的。

急不来,等它过期。

#留下的习惯

发布目录永远显式写出来,不用 .。多打十几个字符,换掉一整类事故。

留言

评论区还没开。想聊两句的话,写封信给我,可以直接交流。