Cloudflare CAPTCHA:仅针对包含至少一个“&”的搜索触发
Simon Willison 使用 Cloudflare 托管挑战(CAPTCHA)来防止爬虫过度抓取其分面搜索引擎,但简单的搜索(如 ?q=term)也会触发挑战,令人困扰。通过 Claude Code 的帮助,他发现可以设置自定义规则,仅对包含至少一个 & 符号的搜索 URL 触发 CAPTCHA,从而让简单搜索免于挑战。
Simon Willison 在其个人网站上运行着一个分面搜索引擎,该搜索引擎基于 Django 和 PostgreSQL 构建,允许用户通过多种维度进行组合查询。然而,这个功能强大的工具也吸引了大量爬虫,它们会系统地遍历所有可能的搜索组合,给服务器带来了不小的压力。
为了保护网站资源,Willison 使用了 Cloudflare 的 Web 应用程序防火墙(WAF)功能,具体来说是其中的“托管挑战”(Managed Challenge),也就是我们常说的 CAPTCHA。这种方法原本能够有效阻止恶意爬虫,但一个令人烦恼的问题是,即使是像 /search/?q=lemur 这样最简单的搜索请求,也会触发 CAPTCHA 挑战,给真实用户带来不便。
为了解决这个问题,Willison 尝试使用 Claude Code 来寻找更精细的控制方法。经过一番摸索,他发现可以在 Cloudflare 中设置一条自定义规则,使得 CAPTCHA 仅在搜索 URL 包含至少一个 & 符号时才会被触发。这条规则的具体表达式为:
(http.request.uri.path wildcard r"/search/*" and http.request.uri.query contains "&")
在 Cloudflare 的规则引擎中,& 符号代表了 URL 查询参数之间的分隔符。简单的搜索只有 q 参数,因此不包含 &;而复杂的多参数搜索(例如 ?q=lemur&sort=date&page=2)则会包含 &。通过这条规则,只有那些多参数、可能是爬虫构造的复杂查询才会受到 CAPTCHA 的限制,而普通的单参数搜索则畅通无阻。
Willison 表示,应用这条规则后,/search/?q=lemur 这样的 URL 不再弹出 CAPTCHA 挑战,用户体验得到了显著提升。这个技巧不仅解决了实际问题,也展示了 Cloudflare 规则引擎的灵活性和强大功能,同时体现了通过 AI 辅助工具(如 Claude Code)快速解决技术难题的潜力。