如何在动态呈现中为搜索引擎用户代理提供静态 HTML?

Posted

技术标签:

【中文标题】如何在动态呈现中为搜索引擎用户代理提供静态 HTML?【英文标题】:How to Serve Static HTML to the Search Engine User-Agents in Dynamic Rendering? 【发布时间】:2020-04-04 04:44:15 【问题描述】:

我正在尝试使用“Prerender.cloud”服务创建一个动态渲染示例。我采用了我的 URL 的预呈现版本。

我可以把代码结构放在这里,但这不是问题。

a) 我净化了 CSS。 b) 我删除了所有不必要的代码和资源。 c) 我更改了资源顺序/组织以获得更好的速度。 d) 优化图像。 e) 减少了请求的大小。 f) 减小了页面大小。

我将页面速度提高了 3 秒,并减小了 %200 的大小。

但主要问题在这里:

我有一个 rootdomain.com/example-dynamic-rendering 页面。这是原始页面。我想把这个提供给客户。

另外,我有我的预渲染示例,我想知道如何将这个静态 html 页面从同一 URL 提供给搜索引擎用户代理?

您对此任务有任何想法或代码吗?

请帮忙。

【问题讨论】:

有没有人提供一些有用的信息? 【参考方案1】:

您可以使用 puppeteer 加载该动态页面/应用程序并加载它的 HTML 并将内容保存到 HTML 文件中。然后,如果 Google bot 抓取工具访问您的网站,您可以要求他们通过 robots.txt 文件抓取此 HTML 文件。

您可以在每次想要运行时运行此 puppeteer 脚本。也许你可以使用cron 来自动运行这个脚本。

类似这样的:

const puppeteer = require ('puppeteer')
const CronJob = require ('cron').CronJob
const fs = require ('fs-extra')

const crontask = '0 */1 * * *' // This will run script every hour
const urlDynamic = 'https://www.example.com' // Change this to your dynamic url
const staticFile = 'statichtml.html'

;(async () => 

    const browser = await puppeteer.launch (
        headless: true,
        devtools: false
    )

    const [page] = await browser.pages ()

    const autorun = async () => 

        const open = await page.goto ( urlDynamic,  waitUntil: 'networkidle2', timeout: 0  )

        const html = await page.content ()

        const save = await fs.writeFile ( staticFile, html )

    

    const job = new CronJob(crontask, async () => 
        autorun ()
    )
    job.start()

)

【讨论】:

感谢您的回答,但我没有收到“如果 Google 机器人爬虫访问您的网站,您可以要求他们通过 robots.txt 文件抓取此 HTML 文件。” Robots.txt 文件用于告诉搜索引擎机器人该做什么。我试图仅将静态 HTML 提供给搜索引擎用户代理,而不是客户端。客户将使用该页面的普通版本。 谷歌机器人爬虫是搜索引擎机器人。我很困惑,但你想用这个静态 HTML 服务哪一个?谷歌机器人还是客户端?如果是 Google Bots,那么您可以将 statichtml.html 完整 URL 保存在 Robots.txt 中允许的 URL 列表中。如果您不能正确理解我的话,我很抱歉。 让我这样问;您好,有一段时间我正在研究动态渲染。我正在尝试自己实现它。我不是开发人员,但我仍然相信我可以做到。我创建了一个示例静态 HTML 网页示例。我只想将此示例提供给搜索引擎用户代理,同时将普通网页提供给客户端。但是,在 wordpress 网站中,我怎样才能做到这一点? Wordpress 几乎为这个动态 CMS 提供了所有缓存解决方案。您是否正在尝试制作自己的 Wordpress 插件? 不,兄弟,我只是简单地尝试将同一 URL 上的不同内容提供给不同的用户代理。我不知道该怎么做,这很容易理解,但感谢您的尝试。

以上是关于如何在动态呈现中为搜索引擎用户代理提供静态 HTML?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以根据用户代理(设备类型)在 vercel 上使用 nextjs 提供不同版本的静态页面?

来,带你手撕一个AOP

类的加载机制和反射——使用反射生成JDK动态代理

如何在android中为jsoup设置用户代理和连接超时

静态网页与动态网页区别

侃侃静态代理和动态代理