spatie/laravel-referer

在会话中保留访问者的原始来源

1.9.0 2024-04-08 07:56 UTC

This package is auto-updated.

Last update: 2024-09-08 08:51:49 UTC


README

Latest Version on Packagist Software License run-tests Total Downloads

在会话中记住访问者的原始来源。来源(按优先级排序)

  • 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)。请参阅许可文件以获取更多信息。