Пренасочете Facebook Scraper към /?_escaped_fragment_= с URL адреси на HTML5 история (без хешбанг) ​​за AJAX съдържание

Ако използвате hashbang URL адреси, а la /#!/path/to/content, скреперът на Facebook (както и Googlebot) автоматично ще препрати към /?_escaped_fragment_=/path/to/content, където можете да визуализирате съдържание от страната на сървъра, което скреперът да използва.

За Google, ако включите мета маркер на фрагмент (<meta name="fragment" content="!">), можете да използвате URL адреси в стила на историята на HTML5 (напр. просто /path/to/content) и той все още ще знае да пренасочи към URL адреса на екранирания фрагмент.

Facebook изглежда не поддържа това. Той ще пренасочи към каквото и да зададете мета тага og:url, но не съм сигурен, че това е правилното използване на тага og:url.


person Kevin C.    schedule 23.11.2013    source източник


Отговори (2)


И така, след като днес говорих с вас в Twitter и направих собствено проучване, единственото решение, което открих, че ми подхожда, е следното:

Използвам node+express. Първо проверявам низа на заявката за робота на Google, но ако потребителският агент е 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/" е: ./snapshots/snapshot__contact.html

Всичко това е тествано и работи чудесно!

person Yuri    schedule 18.01.2014

Това не е тествано, но вярвам, че можете да надушите потребителския агент на Facebook бота и да го препратите към /?_escaped_fragment_ URL въз основа на това.

person Kevin C.    schedule 18.01.2014