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
- 刷新页面(确保保持开发者工具打开)