tsekka / prerender
Prerender
Requires
- php: >=8.0
- chrome-php/chrome: ^1.2
- guzzlehttp/guzzle: ^7.0
- illuminate/support: ~8|~9
- symfony/psr-http-message-bridge: ^2.0
Requires (Dev)
- barryvdh/laravel-ide-helper: ^2.10
- nunomaduro/larastan: ^1.0
- phpunit/phpunit: ~9.0
README
此包旨在简化向爬虫提供预渲染页面,以改善SEO。
如果以下情况适用,您可以使用它:
- 您正在使用Laravel作为单页Web应用的后端
- 或您的Laravel应用的部分是使用JavaScript生成的。
它可以作为一个
- 第三方预渲染服务的中间件(如prerender.io),但
- 它也可以缓存预渲染响应并保持缓存响应的最新状态(用于运行本地预渲染服务器)。
安装
通过Composer
$ composer require tsekka/prerender
准备数据库
该包加载迁移
php artisan migrate
发布配置文件
发布配置文件是可选的。
php artisan vendor:publish --provider="Tsekka\Prerender\PrerenderServiceProvider" --tag="config"
注册预渲染中间件
通过在.env文件中添加PRERENDER_REGISTER_GLOBALLY=true
启用所有路由的预渲染;或者添加特定路由的中间件
// app/Http/Kernel.php protected $routeMiddleware = [ // ... 'prerender' => \Tsekka\Prerender\Http\Middleware\PrerenderMiddleware::class, ]; // routes/web.php Route::get('/{path?}', 'SPAController')->where('path', '.*') ->middleware('prerender');
第三方服务预渲染
使用prerender.io或类似服务,您无需自己安装node服务器和无头Chrome。
此包的主要用途是简化运行自定义预渲染服务器及其响应的缓存。然而,为爬虫开始预渲染页面的最简单方法是通过第三方服务如prerender.io。
- 在prerender.io或类似服务注册,并遵循他们的说明。
- 设置预渲染器的URL
PRERENDER_URL=https://service.prerender.io
和令牌PRERENDER_TOKEN=YOUR-THIRD-PARTY-TOKEN
(在.env文件中添加此信息) - Prerender.io已经缓存了页面以提高速度,因此您可以关闭本地缓存
PRERENDER_CACHE_TTL=null
(.env) - 注册中间件,然后您就可以开始了!
运行您自己的预渲染服务
要运行您自己的预渲染服务,您必须在您的web服务器上安装Node、headless Chrome及其依赖项。
Prerender.io已经开源了 node服务器,您可以使用它来在您的服务器上预渲染页面。
以下是您如何使用它的方法
- 安装并运行预渲染器的node服务器。
- 从本包目录(
cp -r ./vendor/tsekka/prerender/prerenderer ./prerenderer
)克隆它,并安装依赖项cd prerenderer && npm install
。 - 您也可以遵循 这个快速教程,其中包含如何在基于Debian的Linux发行版上安装无头Chrome浏览器的说明。
- 从本包目录(
- 将预渲染器的URL设置为预渲染器服务的URL。例如,如果您在本地运行它,则将
PRERENDER_URL=https://:3000
添加到您的.env文件中。 - 决定您是要持续运行预渲染服务器还是仅在计划命令期间启动服务器。
- 如果您要持续运行服务器,那么启动预渲染服务器
node server.js
并确保即使在web服务器重启后,node服务器也会重新启动。 - 如果您更愿意仅在预渲染命令期间启动服务器,那么在.env文件中设置
PRERENDER_RUN_LOCAL_SERVER=true
。
- 如果您要持续运行服务器,那么启动预渲染服务器
- 注册中间件
- 按需预渲染页面可能很慢,因此默认情况下页面将被缓存。
- 建议您设置计划以重新缓存预渲染页面。
缓存预渲染响应
预渲染页面可能需要几秒钟甚至更长时间。
因此,页面默认将缓存1周。
您可以通过设置.env变量PRERENDER_CACHE_TTL
和PRERENDER_CACHE_DRIVER
或通过发布和修改配置文件来更改缓存时间并缓存驱动程序。
如果您正在使用Prerender.io之类的第三方服务,那么响应可能已经缓存,因此您可以关闭本地缓存(在您的.env中添加PRERENDER_CACHE_TTL=null
)。
运行缓存命令
您可以通过运行php artisan prerender:cache
命令来缓存定义在可缓存URL数组中的所有页面。
默认情况下,缓存命令仅缓存尚未缓存的URL或缓存ttl已过期的URL。您可以通过使用--force选项(php artisan prerender:cache --force
)来重新缓存所有URL。
保持预渲染页面最新
按需预渲染页面可能很慢,因此建议始终在缓存中保持页面的最新副本。
您可以设置事件监听器以保持预渲染页面同步
// 1. Set up event-listener // 2. Inside your listener: public function handle($event) { return \Artisan::call('prerender:cache', [ 'url' => '/your-model-resource-url', '--force' => true, '--log' => false, ]); }
或安排在指定时间预渲染和重新缓存
// app/Console/Kernel.php protected function schedule(Schedule $schedule) { // Daily re-cache all urls that's cache-time-to-live is expired $schedule->command('prerender:cache')->dailyAt("02:00"); // Daily re-cache all urls $schedule->command('prerender:cache --force')->dailyAt("02:00"); }
提供要缓存的URL列表
每次爬虫访问符合预渲染要求的URL时,预渲染响应将被缓存,并记录请求的URL到数据库中。
因此,在您实际开始使用该包之前,列表将是空的,URL将在请求时进行预渲染(因此请求时间可能会相当慢,因为预渲染需要时间)。
如果您只想在按需缓存页面,或者您想即使在第一次爬虫访问时也保持响应时间低,那么您应该通过发布配置文件并修改其cacheable_urls
值来提供一个类与方法名称,该方法返回URL数组。
删除旧条目
该包将所有爬虫访问记录到数据库中。
使用php artisan prerender:prune
命令来清除旧条目。
您还可以安排Artisan命令
// app/Console/Kernel.php protected function schedule(Schedule $schedule) { // Daily prune all crawler visit entries older than 1 month $schedule->command('prerender:prune "1 month"')->daily(); }
白名单URL
白名单路径或模式。您可以使用通配符语法。如果提供了白名单,则仅包含白名单路径的URL将被预渲染。空数组表示所有URI都将通过此过滤器。注意,这是完整的请求URI,包括起始斜杠和查询参数字符串。
// prerender.php: 'whitelist' => [ '/frontend/*' // only prerender pages starting with '/frontend/' ],
黑名单URL
要排除的路径。您可以使用通配符语法。如果提供了黑名单,则除了包含黑名单路径的URL之外的所有URL都将被预渲染。默认情况下,包括一组资产扩展名(这实际上仅当您通过路由动态提供资产时才需要)。注意,这是完整的请求URI,包括起始斜杠和查询参数字符串。
// config/prerender.php 'blacklist' => [ '/api/*' // do not prerender pages starting with '/api/' // ... ],
其他资源
如果您不知道何时或为什么应该预渲染您的SPA应用,那么有一些资源供您查阅
贡献
本包正在开发中。欢迎贡献力量,并将予以认可。
安全
如果您发现任何安全问题,请通过电子邮件 kristjan@pintek.ee 联系,而不是使用问题跟踪器。
致谢
- 基于Jeroen Noten的 Laravel-Prerender 进行分支。
许可证
MIT。请参阅许可证文件以获取更多信息。