Facebook 采用了错误的规范 URL

Facebook takes wrong canonical URL

问题场景:

  1. 我们在网站上强制执行 HTTPS。任何使用 HTTP 的 URL 现在重定向(301 永久重定向)到适当的 HTTPS URL.

  2. 为了避免 Facebook like/share 按钮(放置在网站的许多页面上)丢失以前的 likes/shares 编号,我们将按钮设为 "link"通过 "data-href" 属性.

  3. 到旧的 HTTP URLs
  4. 此外,我们在某些页面上放置了 "og:url" 元标记,指向旧的 HTTP URLs。

  5. 然后我在 Facebook 调试器工具 https://developers.facebook.com/tools/debug 上抓取了这些页面,以确保 Facebook 获得最新数据。根据抓取的数据,规范的 URLs 确实指向旧的 HTTP URLs,正如我们上面列出的操作所应该的那样。这也反映在我们页面上保留旧号码的 like/share 按钮中。

  6. 几天后我发现有些页面丢失了 likes/shares 的旧数字。检查 Facebook 调试器中的页面显示 Facebook 现在将 HTTPS URLs 作为规范。我们没有对页面进行任何更改,"og:url" 标记仍然指向 HTTP URLs。但是 Facebook 错误地将 HTTPS URLs 视为规范 URLs。现在,如果我在调试器中再次抓取信息,它又会变得正常,将 HTTP 显示为规范并恢复 likes/shares 的旧数字。但显然这不是解决问题的方法,因为我们无法持续监控所有页面并一次又一次地抓取它们。

有什么可能导致问题的想法吗?

Facebook 也遵循 HTTP 重定向。您需要让旧的 HTTP URL 可用于抓取工具,而不是将其重定向到 HTTPS 版本。 (爬虫可以被它的 User-Agent 识别,见社交插件常见问题解答。)

旧的 HTTP URL 需要对抓取工具可用,而不是重定向到 HTTPS,正如常见问题解答中提到的那样:

“This also requires that the old URL still renders a document with Open Graph tags and returns a HTTP 200 response, at least when loaded by Facebook's crawler. If you want other clients to redirect when they visit the URL, you must send your 301 HTTP response to all non-Facebook crawler clients. The old URL should contain its own og:url tag that points to itself.”