You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:38:11