当网站陷入了人机验证的死循环,怎么办?

今天在问 Gemini,为什么同样是用的 Cloudflare CDN,别人在国内的解析速度就是比我快。AI 列了很多原因,有可能人家是付费玩家,使用了优选IP,或者是智能DNS。

除此之外,还会有一些设置的问题。例如:

  • TLS 版本: 对方可能强制开启了 TLS 1.3 和 0-RTT(零往返时间恢复),减少了 SSL 握手的往返次数。
  • HTTP/3 (QUIC): CF 支持 QUIC 协议(基于 UDP)。在国内高丢包的网络环境下,QUIC 比传统的 TCP 抗丢包能力强很多,能显著减少“转圈圈”的时间。
  • 缓存规则 (Cache Rules): 对方可能配置了极其激进的缓存策略(比如“Cache Everything”),把 HTML 页面也缓存了。如果用户访问时命中缓存,CF 直接返回数据,不再回源站请求,速度也会快很多。

在 Gemini 的指导下,我开启了0-RTT,最低TLS版本设为了1.2,开启了Early Hints。最后还配置了缓存规则,让 Cloudflare 缓存 Cache Everything(缓存所有内容)。

然后问题就来了,我突然发现访问网站首页时会蹦出人机验证,而且不管怎么弄,就一直卡在人机验证这了。

因为我发现只有首页弹,内页不弹。把这个情况告诉 Geimini 之后,它一下就给我找到了原因,有点好笑。

问题的根源在于我开启了 Cloudflare 的 Cache Everything,并且配置了缓存规则。但是 CF 的缓存有点笨,它把所有页面(只要有人访问的页面)都缓存下来了。然后好巧不巧,在我清除了所有的缓存之后,又在我访问自己的网站首页之前,Cloudflare 恰好拦截过某次访问,生成了一个“验证页面”。然后,我设置的 Cloudflare 页面规则 (Page Rule) 把这个“验证页面”当成正常的首页 HTML 给缓存了。

结果就是:之后访客访问首页,Cloudflare 根本没去检查他们是不是机器人,而是直接从缓存里把那个“旧的验证页面”甩给了访客。访客点击验证,提交给服务器,服务器一脸懵逼(因为没有发起新的验证请求),导致无限循环。

解决办法:直接删掉 Cloudflare 的缓存规则,不要它缓存 HTML,而把这个任务交给 LiteSpeed。

因为 Cloudflare 的缓存有可能会把我登录之后的页面缓存下来。而且还容易造成更新不同步(发了新文章,LiteSpeed 插件清除了服务器缓存,但 Cloudflare 边缘节点还存着旧页面。用户看到的依然是旧网站。)

所以最终我是在 LiteSpeed 的设置中连接了 Cloudflare 的 API,这样以后发布新文章、修改 CSS 或点击 LiteSpeed 的“清除缓存”时,插件会自动发送指令给 Cloudflare,让其把旧缓存也顺便清掉。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注