dyce / laravel-prerender
Laravel 中间件,用于动态渲染 JavaScript 渲染的页面以优化 SEO
Requires
- php: >=7.2
- guzzlehttp/guzzle: ^6.0|^7.0
- illuminate/support: ^6.0|^7.0|^8.0|^9.0|^10.0
- symfony/psr-http-message-bridge: ^1.3|^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: 2.18.6
- orchestra/testbench: ^4.0|^5.0|^6.0
- phpunit/phpunit: ^8.4|^9.0
This package is auto-updated.
Last update: 2024-09-21 00:42:51 UTC
README
此包旨在帮助您快速将 Prerender.io 服务集成到您的 Laravel 应用程序中(仅限 HTTPS)。
🙇 致谢
此包是从 codebar-ag/Laravel-Prerender 克隆而来,codebar-ag 为原作者。
💡 什么是 Prerender.io?
Prerender.io 中间件将检查每个请求以确定它是否来自爬虫。如果是来自爬虫的请求,中间件将向 Prerender.io 发送请求以获取该页面的静态 HTML。如果不是,请求将继续到您的正常服务器路由。爬虫永远不知道您正在使用 Prerender.io,因为响应始终通过您的服务器发送。
谷歌现在在他们的 动态渲染 文档中推荐您使用 Prerender.io!
🛠 要求
- PHP:
^7.2
- Laravel:
^6
- Prerender.io 访问权限
- 带有 SSL 证书的安全网站
⚙️ 安装
您可以通过 composer 安装此包
composer require codebar-ag/laravel-prerender
如果您想使用 Prerender.io 服务,请将以下内容添加到您的 .env
文件中
PRERENDER_TOKEN=token
或者如果您使用的是自托管服务,请将服务器地址添加到 .env
文件中。
PRERENDER_URL=https://prerender.services
这样就完成了。来自爬虫的每个 GET 请求都将被预渲染。
✋ 禁用服务
您可以通过在 .env
文件中添加以下内容来禁用该服务
PRERENDER_ENABLE=false
这可能在您的本地开发环境中很有用。
✏️ 工作原理
- 中间件检查是否应显示预渲染页面
- 中间件检查请求是否来自爬虫(代理字符串或
_escaped_fragment_
) - 中间件检查是否请求资源(js、css 等...)
- (可选) 中间件检查 URL 是否在白名单中
- (可选) 中间件检查 URL 是否不在黑名单中
- 中间件检查请求是否来自爬虫(代理字符串或
- 中间件向 prerender 服务(phantomjs 服务器)发送 GET 请求以获取页面的预渲染 HTML
- 将 HTML 返回给爬虫
🔧 配置文件
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Dyce\LaravelPrerender\LaravelPrerenderServiceProvider"
之后,您可以自定义白名单/黑名单。
这是发布配置文件的内容
<?php return [ /* |-------------------------------------------------------------------------- | Enable Prerender |-------------------------------------------------------------------------- | | Set this field to false to fully disable the prerender service. You | would probably override this in a local configuration, to disable | prerender on your local machine. | */ 'enable' => env('PRERENDER_ENABLE', true), /* |-------------------------------------------------------------------------- | Prerender URL |-------------------------------------------------------------------------- | | This is the prerender URL to the service that prerenders the pages. | By default, Prerender's hosted service on prerender.io is used | (https://service.prerender.io). But you can also set it to your | own server address. | */ 'prerender_url' => env('PRERENDER_URL', 'https://service.prerender.io'), /* |-------------------------------------------------------------------------- | Return soft HTTP status codes |-------------------------------------------------------------------------- | | By default Prerender returns soft HTTP codes. If you would like it to | return the real ones in case of Redirection (3xx) or status Not Found (404), | set this parameter to false. | Keep in mind that returning real HTTP codes requires appropriate meta tags | to be set. For more details, see github.com/prerender/prerender#httpheaders | */ 'prerender_soft_http_codes' => env('PRERENDER_SOFT_HTTP_STATUS_CODES', true), /* |-------------------------------------------------------------------------- | Prerender Token |-------------------------------------------------------------------------- | | If you use prerender.io as service, you need to set your prerender.io | token here. It will be sent via the X-Prerender-Token header. If | you do not provide a token, the header will not be added. | */ 'prerender_token' => env('PRERENDER_TOKEN'), /* |-------------------------------------------------------------------------- | Prerender Whitelist |-------------------------------------------------------------------------- | | Whitelist paths or patterns. You can use asterix syntax, or regular | expressions (without start and end markers). If a whitelist is supplied, | only url's containing a whitelist path will be prerendered. An empty | array means that all URIs will pass this filter. Note that this is the | full request URI, so including starting slash and query parameter string. | See github.com/JeroenNoten/Laravel-Prerender for an example. | */ 'whitelist' => [], /* |-------------------------------------------------------------------------- | Prerender Blacklist |-------------------------------------------------------------------------- | | Blacklist paths to exclude. You can use asterix syntax, or regular | expressions (without start and end markers). If a blacklist is supplied, | all url's will be prerendered except ones containing a blacklist path. | By default, a set of asset extentions are included (this is actually only | necessary when you dynamically provide assets via routes). Note that this | is the full request URI, so including starting slash and query parameter | string. See github.com/JeroenNoten/Laravel-Prerender for an example. | */ 'blacklist' => [ '*.js', '*.css', '*.xml', '*.less', '*.png', '*.jpg', '*.jpeg', '*.svg', '*.gif', '*.pdf', '*.doc', '*.txt', '*.ico', '*.rss', '*.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', '*.eot', '*.ttf', '*.otf', '*.woff', '*.woff2' ], /* |-------------------------------------------------------------------------- | Crawler User Agents |-------------------------------------------------------------------------- | | Requests from crawlers that do not support _escaped_fragment_ will | nevertheless be served with prerendered pages. You can customize | the list of crawlers here. | */ 'crawler_user_agents' => [ 'googlebot', 'yahoo', 'bingbot', 'yandex', 'baiduspider', 'facebookexternalhit', 'twitterbot', 'rogerbot', 'linkedinbot', 'embedly', 'bufferbot', 'quora link preview', 'showyoubot', 'outbrain', 'pinterest', 'pinterest/0.', 'developers.google.com/+/web/snippet', 'www.google.com/webmasters/tools/richsnippets', 'slackbot', 'vkShare', 'W3C_Validator', 'redditbot', 'Applebot', 'WhatsApp', 'flipboard', 'tumblr', 'bitlybot', 'SkypeUriPreview', 'nuzzel', 'Discordbot', 'Google Page Speed', 'Qwantify' ], ];
🤍 白名单
白名单路径或模式。您可以使用星号语法。如果提供了白名单,则仅包含白名单路径的 URL 将被预渲染。空数组表示所有 URI 都将通过此过滤器。请注意,这是完整的请求 URI,包括起始斜杠和查询参数字符串。
// prerender.php: 'whitelist' => [ '/frontend/*' // only prerender pages starting with '/frontend/' ],
🖤 黑名单
黑名单路径,用于排除。您可以使用通配符语法。如果提供了黑名单,除了包含黑名单路径的URL之外,所有URL都将进行预渲染。默认情况下,包含一组资产扩展名(这实际上仅在您通过路由动态提供资产时才需要)。请注意,这是完整的请求URI,因此包括起始斜杠和查询参数字符串。
// prerender.php: 'blacklist' => [ '/api/*' // do not prerender pages starting with '/api/' ],
🚧 本地测试
基于Prerender.io文档中的入门指南。
- 在本地下载并运行预渲染服务器
git clone https://github.com/prerender/prerender.git
cd prerender
npm clean-install
node server.js
默认端口是3000。您可以使用以下方式在另一个端口上启动Node服务器
PORT=3333 node server.js
- 设置预渲染URL
PRERENDER_URL=https://:3000
- (可选)打开浏览器并访问以下URL。请确保将
domain.test
更改为您的本地域名
https://:3000/render?url=https://domain.test
- 以爬虫的形式测试您的页面。请确保将
domain.test
更改为您的本地域名
curl -A Googlebot https://domain.test
- 🎉 就这样——您应该能看到预渲染的HTML!
📝 更新日志
请参阅更新日志以获取有关最近更改的更多信息。
✏️ 贡献
请参阅贡献指南以获取详细信息。
🧑💻 安全漏洞
请查看我们的安全策略以了解如何报告安全漏洞。
🎭 许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。