使用HTML5历史URL(无hashbang)将Facebook Scraper重定向到/?_ escaped_fragment_ =

时间:2013-11-23 02:09:54

标签: facebook facebook-graph-api facebook-social-plugins

如果您使用hashbang网址,la /#!/path/to/content,Facebook刮刀(以及Googlebot)将自动转发到/?_escaped_fragment_=/path/to/content,您可以在其中呈现内容服务器端以供刮刀使用

对于Google,如果您添加了片段元标记(<meta name="fragment" content="!">),则可以使用HTML5历史记录样式网址(例如,只需/path/to/content),并且仍然可以知道重定向到转义的片段网址

Facebook似乎并不支持这一点。 重定向到您设置og:url元标记的任何内容,但我不确定这是否正确使用了og:url标记。

2 个答案:

答案 0 :(得分:1)

这是未经测试的,但我相信你可以嗅出Facebook僵尸的用户代理并将其转发到基于此的/?_escaped_fragment_网址。

答案 1 :(得分:0)

所以今天在Twitter上与你交谈并做我自己的研究之后,我找到的唯一适合我的解决方案如下:

我正在使用node + express。我首先检查查询字符串是否为google crawler,但如果用户代理是facebook,我会使用它代替我的片段变量。然后我解析url并使用grunt-htmlSnapshot插件匹配我创建的一个快照。

app.use(function(req, res, next) {
      var userAgent = req.headers['user-agent'];

      var fragment = req.query._escaped_fragment_;

      if (userAgent.indexOf('facebookexternalhit') >= 0) {
        fragment = req.url;
      }

      // If there is no fragment in the query params
      // then we're not serving a crawler
      if (!fragment) return next();

      // If the fragment is empty, serve the
      // index page
      if (fragment === "" || fragment === "/")
        fragment = "/.html";

      // If fragment does not start with '/'
      // prepend it to our fragment
      if (fragment.charAt(0) !== "/")
        fragment = '/' + fragment;

      // If fragment does not end with '.html'
      // append it to the fragment
      if (fragment.indexOf('.html') == -1)
        fragment += ".html";

      fragment = fragment.replace(/\//g, '_');
      // Serve the static html snapshot
      try {
        var file = "./snapshots/snapshot_" + fragment;
        res.sendfile(file);
      } catch (err) {
        res.send(404);
      }
    });

我的所有快照都存储在./snapshots中,而“/ contact /”页面的快照示例为:./ snapshot_snapshot__contact.html

这一切都经过测试,效果很好!