启用App Check的Firebase+Angular应用如何允许Google Bot爬取并实现网站索引
解决方案:在启用Firebase App Check的Angular应用中允许Google爬虫索引
我完全懂你的两难处境——刚遭遇过200万次请求的攻击,肯定不敢随便关掉App Check,但Google爬虫又因为被拦截没法索引你的Angular应用,而且项目已经深入没法转SSR。别着急,这里有几个切实可行的方案,你可以按需选择:
1. 给Google爬虫添加App Check豁免规则
Firebase App Check支持针对特定请求放行,不需要全局禁用防护。你可以通过两种方式配置:
- 控制台直接配置豁免:进入Firebase控制台的App Check页面,找到你的Web应用,在“安全规则”或“豁免列表”中添加规则,匹配Googlebot的用户代理(UA)字符串,比如
Googlebot/2.1、Mediapartners-Google等。不过要注意,UA可能被伪造,所以更安全的做法是结合Google爬虫的官方IP范围(Google会公开这些IP段)来设置IP豁免。 - 自定义验证逻辑:如果你的后端用了Cloud Functions或Firebase Admin SDK,可以在验证App Check Token之前,先检查请求的UA和IP是否属于合法的Google爬虫。比如在Cloud Functions里,先反向解析请求IP的DNS,如果结果指向
googlebot.com,再正向解析该域名确认IP一致,符合条件就跳过App Check验证。
2. 使用Angular预渲染(Prerendering)替代SSR
你说没法切换SSR,但预渲染是更轻量的选择,几乎不需要改动现有代码,适合已经开发到后期的项目:
- 首先在Angular CLI中配置预渲染:修改
angular.json,在architect.build.options里添加"prerender": true,并指定要预渲染的路由(比如首页、产品页等核心页面)。 - 执行
ng build后,dist目录里会生成对应路由的静态HTML文件,这些文件包含了页面的完整内容,爬虫可以直接读取。 - 然后在Firebase Hosting的
firebase.json里设置重写规则:当检测到请求UA包含Googlebot时,返回预渲染的静态HTML;其他正常用户请求则走常规的Angular应用,同时保持App Check的防护。
示例重写规则(firebase.json):
{ "hosting": { "rewrites": [ { "source": "**", "condition": { "userAgent": "Googlebot|bingbot|Slurp", "not": true }, "destination": "/index.html" }, { "source": "/about", "destination": "/about/index.html" }, // 其他预渲染路由的规则 ] } }
3. 结合Firebase Hosting的爬虫缓存策略
如果你的页面内容更新不频繁,可以利用Firebase Hosting的缓存功能,针对爬虫请求返回缓存的静态版本。具体来说,在firebase.json中配置缓存规则,当爬虫请求时,返回缓存的预渲染页面,既满足索引需求,又不会影响正常用户的动态体验,同时App Check依然生效。
关键提醒:验证爬虫真实性
不管用哪种方案,都不要只依赖UA判断——攻击者很容易伪造Googlebot的UA。最安全的方式是反向DNS验证:拿到请求IP后,执行反向DNS查询,如果结果是*.googlebot.com或*.google.com,再正向解析该域名,确认返回的IP和原请求IP一致,这样才能确定是真实的Google爬虫。
比如在Cloud Functions里的验证代码片段:
const dns = require('dns').promises; async function isLegitimateGooglebot(ip) { try { const hostnames = await dns.reverse(ip); const isGoogleHostname = hostnames.some(host => host.endsWith('.googlebot.com') || host.endsWith('.google.com') ); if (!isGoogleHostname) return false; const resolvedIps = await dns.resolve(hostnames[0]); return resolvedIps.includes(ip); } catch (err) { return false; } }
这样既能保证爬虫正常索引,又不会让App Check的安全防护打折扣。
内容的提问来源于stack exchange,提问作者yeet
相关产品推荐
相关产品推荐

