spatie / laravel-referer
在会话中保留访问者的原始来源
Requires
- php: ^7.4|^8.0
- illuminate/contracts: ^8.73|^9.0|^10.0|^11.0
- illuminate/http: ^8.73|^9.0|^10.0|^11.0
- illuminate/support: ^8.73|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^6.23|^7.0|^8.0|^9.0
- phpunit/phpunit: ^9.5|^10.5
README
在会话中记住访问者的原始来源。来源(按优先级排序)
utm_source
查询参数- 如果URL中存在外部主机,则从请求的
Referer
头中获取的域名 - 空
支持我们
我们投入了大量资源来创建一流的开放源代码包。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从您的家乡给我们寄明信片,说明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们将在我们的虚拟明信片墙上公布所有收到的明信片。
安装
您可以通过composer安装此包
composer require spatie/laravel-referer
该包将在Laravel 5.5中自动注册自己。在Laravel 5.4中,您需要手动在config/app.php
中注册Spatie\Referer\RefererServiceProvider
服务提供者。
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Spatie\Referer\RefererServiceProvider"
如果您想要更改会话中存储来源的键或想要禁用一个来源,则发布配置文件是必要的。
return [ /* * The key that will be used to remember the referer in the session. */ 'session_key' => 'referer', /* * The sources used to determine the referer. */ 'sources' => [ Spatie\Referer\Sources\UtmSource::class, Spatie\Referer\Sources\RequestHeader::class, ], ];
用法
要捕获来源,您只需将Spatie\Referer\CaptureReferer
中间件添加到您的中间件堆栈中。在大多数配置中,您只想在“web”请求中捕获来源,因此将其注册在web
堆栈中是有意义的。确保它位于Laravel的StartSession
中间件之后!
// app/Http/Kernel.php protected $middlewareGroups = [ 'web' => [ // ... \Illuminate\Session\Middleware\StartSession::class, // ... \Spatie\Referer\CaptureReferer::class, // ... ], // ... ];
检索来源的最简单方法是直接从容器中解析它
use Spatie\Referer\Referer; $referer = app(Referer::class)->get(); // 'google.com'
或者您可以选择使用Laravel的自动门面
use Facades\Spatie\Referer\Referer; $referer = Referer::get(); // 'google.com'
捕获到的来源(从高到低优先级)
utm_source
查询参数,或者- 如果URL中存在外部主机,则从请求的
Referer
头中获取的域名,或者 - 空
空来源永远不会覆盖现有的来源。因此,如果一个访问者从google.com来到您的网站并访问了几个页面,这些页面不会影响来源,因为本地主机被忽略。
忘记或手动设置来源
Referer
类提供了专门的方法来忘记或手动设置来源。
use Facades\Spatie\Referer\Referer; Referer::put('google.com'); Referer::get(); // 'google.com' Referer::forget(); Referer::get(); // ''
更改确定来源的方式
来源是通过检查配置中定义的各种来源来确定的。
return [ // ... 'sources' => [ Spatie\Referer\Sources\UtmSource::class, Spatie\Referer\Sources\RequestHeader::class, ], ];
一个来源实现了Source
接口,需要一种方法,getReferer
。如果一个来源能够确定来源,则其他来源将被忽略。换句话说,sources
数组是按优先级排序的。
在下一个示例中,我们将添加一个可以使用?ref
查询参数来确定来源的来源。此外,我们还将禁用?utm_source
参数。
首先,创建源实现
namespace App\Referer; use Illuminate\Http\Request; use Spatie\Referer\Source; class RefParameter implements Source { public function getReferer(Request $request): string { return $request->get('ref', ''); } }
然后注册您的源在sources
数组中。同时,我们也将禁用utm_source
。
return [ // ... 'sources' => [ App\Referer\RefParameter::class, Spatie\Referer\Sources\RequestHeader::class, ], ];
就是这样!源实现可以是这样的简单,也可以更复杂,如果需要的话。
变更日志
请参阅变更日志以获取更多关于最近更改的信息。
测试
composer test
贡献
请参阅贡献指南以获取详细信息。
安全
如果您发现与安全相关的错误,请通过邮件security@spatie.be联系,而不是使用问题跟踪器。
鸣谢
许可协议
MIT许可协议(MIT)。请参阅许可文件以获取更多信息。