【问题标题】:Can you write a Firebase Function that only get triggered by GoogleBot你能写一个只由 GoogleBot 触发的 Firebase 函数吗
【发布时间】:2018-01-04 11:32:20
【问题描述】:

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

但是,搜索引擎只会看到空白页而不是动态内容。我创建了一个 Firebase 函数来为 SEO 目的预渲染每个页面,效果很好。

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

是否可以仅触发 GoogleBot(和其他已知的爬虫/机器人)的预渲染功能,从而为用户提供正常的网站体验并为机器人提供预渲染的 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"

但是附加了sn-p:

"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,每个插件都将所有内容报告为机器人

【问题讨论】:

    标签: javascript firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    Cloud Functions for Firebase 使用 Express 中间件作为其 HTTP 触发器。所以检测爬虫是很有可能的,如下图Detect social bots in Node ExpressHow 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,特别是他对setting cache headers in Cloud Functions的解释。

    【讨论】:

    • 感谢 Frank,但无论使用什么浏览器或请求来自何处,每个用户代理请求似乎都来自 AppEngine-Google 家族。
    • 嗯....我不知道这是否是预期的。您能否更新您的问题以包括minimal code needed to reproduce this problem 以及您获得的用户代理以及您如何触发该功能?
    • 嗨弗兰克,我添加了一个编辑,如果您需要更多说明,请告诉我。
    • 它看起来像是在某处将 ` (+code.google.com/appengine; appid: s~gcf-http-proxy)` 添加到用户代理。虽然这出乎意料的,但代理向 UA 添加信息的情况并不少见。您必须在服务器端代码中进行相应的过滤。
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2020-09-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多