zfr/zfr-prerender

与prerender.io服务的集成

v3.2.0 2018-07-22 14:32 UTC

This package is auto-updated.

Last update: 2024-08-29 04:45:14 UTC


README

Build Status Scrutinizer Quality Score Coverage Status Latest Stable Version

您正在使用Backbone、Angular、EmberJS等框架,但不确定对SEO的影响吗?

这个Zend Framework 2模块使用Prerender.io,通过PhantomJS在服务器上动态渲染JavaScript页面。

安装

通过输入(或将其添加到您的composer.json文件)安装模块

$ php composer.phar require zfr/zfr-prerender:3.*

文档

工作原理

  1. 检查是否应该显示预渲染的页面
    1. 检查请求是否来自爬虫(通过代理字符串或检测escaped_fragment查询参数)
    2. 检查是否请求资源(js、css等...)
    3. (可选) 检查URL是否在白名单中
    4. (可选) 检查URL不在黑名单中
  2. prerender服务(PhantomJS服务器)发送针对页面预渲染HTML的GET请求
  3. 将HTML返回给爬虫

自定义

ZfrPrerender提供了合理的默认设置,但您可以通过将config/zfr_prerender.global.php.dist文件复制到您的autoload文件夹(删除.dist扩展名)来自定义模块,并根据您的需求进行修改。

预渲染URL

默认情况下,ZfrPrerender使用部署在http://service.prerender.io的Prerender.io服务。但是,您可能想在自己的服务器上部署它。为此,您可以使用以下配置来自定义ZfrPrerender以使用您的服务器

return array(
    'zfr_prerender' => array(
        'prerender_url' => 'http://myprerenderservice.com'
    )
);

使用此配置,以下是ZfrPrerender将如何代理https://google.com请求的方式

GET http://myprerenderservice.com/https://google.com

爬虫用户代理

ZfrPrerender决定预渲染,基于用户代理字符串检查请求是否来自机器人。默认情况下,这些用户代理已注册:baidufacebookexternalhittwitterbot

从ZfrPrerender 2.0开始,GoogleBot、Yahoo和BingBot不在列表中,因为这些搜索引擎支持escaped_fragment方法,我们希望确保人们不会因cloaking而受到惩罚。

您可以通过此示例配置添加其他要评估的用户代理字符串

return array(
    'zfr_prerender' => array(
        'crawler_user_agents' => array('yandex', 'msnbot')
    )
);

注意:ZfrPrerender还支持通过使用_escaped_fragment_查询参数检测爬虫。您可以在Google的网站上了解更多信息。

忽略的扩展名

默认情况下,ZfrPrerender 配置为忽略所有请求以下扩展名的资源:.css.gif.jpeg.jpg.js.png.less.pdf.doc.txt.zip.mp3.rar.exe.wmv.doc.avi.ppt.mpg.mpeg.tif.wav.mov.psd.ai.xls.mp4.m4a.swf.dat.dmg.iso.flv.m4v.torrent。这些资源永远不会被预渲染。

您可以使用以下示例配置添加自己的扩展名

return array(
    'zfr_prerender' => array(
        'ignored_extensions' => array('.less', '.pdf')
    )
);

白名单

可以白名单单个URL路径或多个URL路径。使用正则表达式进行比较,因此尽可能具体。如果提供了白名单,则只有包含白名单路径的URL将被预渲染。

以下是一个示例配置,预渲染包含"/users/"的URL

return array(
    'zfr_prerender' => array(
        'whitelist_urls' => array('/users/*')
    )
);

注意:请在这里指定URL,而不是ZF2路由名称。这是因为ZfrPrerender注册了一个监听器,它在MVC过程非常早期时发生,在路由实际完成之前。

黑名单

可以黑名单单个URL路径或多个URL路径。使用正则表达式进行比较,因此尽可能具体。如果提供了黑名单,则除了包含黑名单部分的URL之外的所有URL都将被预渲染。请注意,如果引用者是黑名单的一部分,它也不会被预渲染。

以下是一个示例配置,预渲染所有除了包含"/users/"的URL

return array(
    'zfr_prerender' => array(
        'blacklist_urls' => array('/users/*')
    )
);

注意:请在这里指定URL,而不是ZF2路由名称。这是因为ZfrPrerender注册了一个监听器,它在MVC过程非常早期时发生,在路由实际完成之前。

事件

ZfrPrerender\Mvc\PrerenderListener触发两个事件

  1. ZfrPrerender\Mvc\PrerenderEvent::EVENT_PRERENDER_PRE:此事件在实际向预渲染服务发送请求之前触发。如果您从附加到此事件的监听器返回一个Zend\Http\Response对象,它将立即返回此响应,从而避免向预渲染服务发送新的请求。
  2. ZfrPrerender\Mvc\PrerenderEvent::EVENT_PRERENDER_POST:此事件在从预渲染服务收到响应后触发。这允许您对其进行缓存(例如在Memcached中)。

附加到这两个事件的监听器将接收到一个ZfrPrerender\Mvc\PrerenderEvent的实例。以下是一个示例,展示了如何使用共享事件管理器注册监听器。在您的Module.php类中

use ZfrPrerender\Mvc\PrerenderEvent;

public function onBootstrap(MvcEvent $event)
{
    $eventManager  = $event->getTarget()->getEventManager();
    $sharedManager = $eventManager->getSharedManager();

    $sharedManager->attach(
        'ZfrPrerender\Mvc\PrerenderListener',
        PrerenderEvent::EVENT_PRERENDER_PRE,
        array($this, 'prerenderPre')
    );

    $sharedManager->attach(
        'ZfrPrerender\Mvc\PrerenderListener',
        PrerenderEvent::EVENT_PRERENDER_POST,
        array($this, 'prerenderPost')
    );
}

public function prerenderPre(PrerenderEvent $event)
{
    $request = $event->getRequest();

    // Check from your cache if you have already the content
    // $content = ...

    $response = new Response();
    $response->setStatusCode(200);
    $response->setContent($content);

    return $response;
}

public function prerenderPost(PrerenderEvent $event)
{
    // This is the response we get from the Prerender service
    $response = $event->getResponse();

    // You could get the body and put it in cache
    // ...
}

测试

如果您想确保您的页面正确渲染

  1. 在Chrome中打开开发者工具(Cmd + Atl + J)
  2. 点击右下角的设置齿轮
  3. 点击设置面板左侧的"Overrides"(覆盖)
  4. 勾选"User Agent"(用户代理)复选框
  5. 从用户代理下拉菜单中选择"Other..."(其他...)
  6. 在输入框中输入googlebot
  7. 刷新页面(确保保持开发者工具打开)