你能写一个只被 GoogleBot 触发的 Firebase 函数吗?

Can you write a Firebase Function that only get triggered by GoogleBot

所以我使用 Firebase 创建了一个单页 Web 应用程序,其中每个页面都有从 Firebase 数据库动态加载的内容。

然而,搜索引擎只会看到空白页面,而看不到动态内容。我创建了一个 Firebase 函数来预呈现每个页面以用于 SEO 目的,效果很好。

问题在于,这主要影响了用户体验,因为函数 运行 存在额外延迟,随后在动态内容与所有其他 JS 一起加载时出现 FOUC。

是否可以只触发 GoogleBot(和其他已知 crawlers/bots)的预呈现功能,从而为用户提供正常的网站体验并为机器人预呈现 html 页面。

谢谢

编辑:

exports.helloWorld = functions.https.onRequest((request, response) => {
  // console.log(request.useragent)
}

预期的用户代理是:

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"

但是附加了代码片段:

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 AppEngine-Google; (+http://code.google.com/appengine; appid: s~gcf-http-proxy)"

我尝试了几个检测机器人的插件,但是由于 AppEngine-Google

,每个插件都将所有内容报告为机器人

Cloud Functions for Firebase 使用 Express 中间件作为其 HTTP 触发器。所以检测爬虫是很有可能的,如图 and How to detect web crawlers for SEO, using Express?.

但我想知道您的方向是否正确。

虽然预渲染可能比提供原始内容花费更多时间,但应该通过立即渲染有意义的再现来补偿这段时间。最近article about server-side rendering with Cloud Functions and Express真是太棒了。

此外(除非您的数据非常动态)您的大多数用户应该访问大多数 HTML 的缓存版本。参见 David Easts talk about dynamic HTTP at I/O, specifically his explanation of setting cache headers in Cloud Functions