zfr / zfr-prerender
与prerender.io服务的集成
Requires
- php: >=5.4
- zendframework/zend-http: ~2.2
- zendframework/zend-servicemanager: ~2.2
Requires (Dev)
- phpunit/phpunit: ~3.7
- satooshi/php-coveralls: ~0.6
- squizlabs/php_codesniffer: 1.5.*
- zendframework/zendframework: ~2.2
README
您正在使用Backbone、Angular、EmberJS等框架,但不确定对SEO的影响吗?
这个Zend Framework 2模块使用Prerender.io,通过PhantomJS在服务器上动态渲染JavaScript页面。
安装
通过输入(或将其添加到您的composer.json文件)安装模块
$ php composer.phar require zfr/zfr-prerender:3.*
文档
工作原理
- 检查是否应该显示预渲染的页面
- 检查请求是否来自爬虫(通过代理字符串或检测escaped_fragment查询参数)
- 检查是否请求资源(js、css等...)
- (可选) 检查URL是否在白名单中
- (可选) 检查URL不在黑名单中
- 向prerender服务(PhantomJS服务器)发送针对页面预渲染HTML的
GET请求 - 将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决定预渲染,基于用户代理字符串检查请求是否来自机器人。默认情况下,这些用户代理已注册:baidu、facebookexternalhit和twitterbot。
从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触发两个事件
ZfrPrerender\Mvc\PrerenderEvent::EVENT_PRERENDER_PRE:此事件在实际向预渲染服务发送请求之前触发。如果您从附加到此事件的监听器返回一个Zend\Http\Response对象,它将立即返回此响应,从而避免向预渲染服务发送新的请求。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 // ... }
测试
如果您想确保您的页面正确渲染
- 在Chrome中打开开发者工具(Cmd + Atl + J)
- 点击右下角的设置齿轮
- 点击设置面板左侧的"Overrides"(覆盖)
- 勾选"User Agent"(用户代理)复选框
- 从用户代理下拉菜单中选择"Other..."(其他...)
- 在输入框中输入googlebot
- 刷新页面(确保保持开发者工具打开)