最近我在 seedloc.com这个站点发现首页图片、图标显示不全,开始以为是1panel的WAF问题,一直没有找到解决的方法。另外也有配置 Cloudflare 自定义安全规则(WAF) 时遇到一个奇怪的问题,记录一下,方便以后小白朋友遇到时快速解决。


❗问题起因

为了阻止陌生人直接访问上传接口 /upload,其实也是AI建议的,我其实不知,建议就加了,在 Cloudflare 上添加了下面这条自定义规则:

当请求路径包含 /upload 时
采取动作 → JavaScript 质询

(这个规则是为了防止恶意访问上传路径)


❓问题表现

✔ 网站可以正常打开
✔ 后台登录正常
✔ 文章页展示正常

但首页却出现资源丢失:

  • 文章封面图无法显示

  • 卡片缩略图缺失

  • 首页布局看起来不完整

如下图所示(示例):

halo-homepage-broken-after-cloudflare-rule.webp

🧠 为什么会这样?

Cloudflare 的这个规则匹配的是:

http.request.uri.path contains "/upload"

这条规则看起来是堵住上传接口,但它却 匹配了所有包含 /upload 的请求,比如:

  • 图片请求 /upload/...webp

  • CSS、JS 静态资源

  • 缩略图接口路径

这些资源请求也会因为匹配 /upload 而被 Cloudflare 拦截或 JS Challenge,从而导致资源加载失败,页面显示异常。

Cloudflare 官方文档中也说明,自定义规则只要匹配到某个条件就会执行指定操作,并且这些规则是按顺序执行的。:contentReference[oaicite:0]{index=0}


🛠 正确且不会误伤资源的规则写法

真正想要的效果是:

✔ 阻止恶意上传行为
✖ 不影响正常资源 GET 请求

所以我们可以更严格地匹配 上传请求(POST)

(http.request.uri.path contains "/upload"
 and http.request.method eq "POST")

这个表达式只会匹配 POST 请求的上传接口 ,不会匹配普通资源的 GET 请求,从而避免误封。


📌 最终规则截图示例

插入到 Cloudflare Dashboard 的匹配条件框中:

(http.request.uri.path contains "/upload"
 and http.request.method eq "POST")

动作建议设置为:

👉 托管质询(Managed Challenge)

或根据需要设置为 阻止 Block 。托管质询对于 API 上传请求更安全,不容易误杀正常访问。


📌 修复后首页恢复正常

关闭原规则后,再启用新版条件匹配规则,首页资源恢复正常:

halo-homepage-normal-after-disable-rule.webp

🧾 总结

❌ 错误写法

http.request.uri.path contains "/upload"

会误匹配所有静态资源路径,并影响页面显示。

✅ 推荐写法(只匹配上传操作)

(http.request.uri.path contains "/upload"
 and http.request.method eq "POST")

🔹 只阻止真正的上传 POST 请求
🔹 不影响 GET 资源访问
🔹 兼容 Halo、WordPress、Typecho、任何站点资源加载模式


如果你也在使用 Cloudflare + Halo、并遇到资源加载异常的问题,不妨参考本文做排查和修复。

欢迎在评论区交流!😊