我发现 NapCat 有个插件的 WebSocket 只能在 HTTP 下有效(然后我被 CF 免费版教育了)

最近折腾 NapCat 的时候,我踩了一个特别离谱、但回头看又觉得挺好笑的坑。

发布于 2026/03/14 08:05 · 已发布 6 个月前

📝 我发现 NapCat 有个插件的 WebSocket 只能在 HTTP 下有效(然后我被 CF 免费版教育了)

最近折腾 NapCat 的时候,我踩了一个特别离谱、但回头看又觉得挺好笑的坑。

事情是这样的—— NapCat 有个插件的 WebSocket 接口,我本来以为随便反代一下就能跑。结果我在 HTTPS 下怎么连都连不上,浏览器永远给我来一句:

WebSocket 连接失败,Error 1006

我一开始还以为是我 Nginx 配置写错了,或者 NapCat 的路径没对上。于是我开始了长达半天的排查:

  • 反代改了又改
  • header 加了又加
  • ws / wss 来回切
  • 连 Docker 端口都重新映射了几次

结果依旧是:HTTP 下秒连,HTTPS 下死活不行。

我当时整个人都不好了。


🧩 真相只有一个:Cloudflare 免费版强制 HTTP/2

我最后盯着 Cloudflare 的文档看了几分钟,突然意识到一个事实:

Cloudflare 免费版强制使用 HTTP/2,而 HTTP/2 对 WebSocket 的支持是残缺的。

换句话说:

  • HTTP → WebSocket 正常
  • HTTPS(CF 免费版)→ WebSocket:你想啥呢兄弟

Cloudflare 免费版根本不给你 HTTP/1.1 直通,而 WebSocket 又必须依赖 HTTP/1.1 的 Upgrade 机制。 于是我这边怎么改都没用,CF 那边直接把我给“优化”掉了。

我当时的心情大概就是:

“好吧,那就不聊了之了。”


🧠 总结一下这次的血泪教训

  • NapCat 插件的 WebSocket 在 HTTP 下完全没问题
  • 一旦走 HTTPS + Cloudflare 免费版,就会因为 HTTP/2 被强制启用而直接寄
  • 你以为是 Nginx 配置问题,其实是 Cloudflare 在背后悄悄给你上了一刀

如果你真的想让它在 HTTPS 下跑起来,那只有几条路:

  • 用 Cloudflare Pro(支持 HTTP/1.1 回源)
  • 不走 CF,直接自己上证书
  • 用 Cloudflare Tunnel(它支持 WebSocket)
  • 或者……继续用 HTTP,反正内网用也没啥

🧩 最后

这事儿折腾完,我只想说一句:

Cloudflare 免费版:我优化你是为你好。 我:谢谢你哦,我不用了。

(use ai)

评论 (0)