You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多站点对接同一后端:如何追踪流量来源站点?

这是个很常见的轻量多租户协作场景,我来分享几个在Laravel里落地的可靠方案,完美适配你的需求:

方案1:URL参数传递来源标识(最简单直接)

这是最容易快速实现的方式,你只需要给每个合作企业的跳转链接加上唯一的来源标识参数,比如:

  • A公司的注册链接:https://your-laravel-backend.com/register?source=a-company
  • B公司的注册链接:https://your-laravel-backend.com/register?source=b-company

接下来在Laravel里处理这个参数,确保它能跟着用户的会话走,直到表单提交:

步骤1:创建中间件捕获并存储来源

先生成中间件:

php artisan make:middleware TrackSource

在app/Http/Middleware/TrackSource.php里编写逻辑:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class TrackSource
{
    public function handle(Request $request, Closure $next)
    {
        // 仅当session未存来源且URL带source参数时处理
        if (!$request->session()->has('source') && $request->has('source')) {
            // 先验证source是否为合法合作企业标识,避免无效值
            $validSources = \App\Models\Company::pluck('identifier')->toArray(); // 从数据库动态获取
            if (in_array($request->query('source'), $validSources)) {
                $request->session()->put('source', $request->query('source'));
            }
        }

        return $next($request);
    }
}

把这个中间件注册到app/Http/Kernel.php的web中间件组,确保所有前端请求都经过它:

protected $middlewareGroups = [
    'web' => [
        // ...其他默认中间件
        \App\Http\Middleware\TrackSource::class,
    ],
];

步骤2:表单提交时读取来源并存库

在你的注册/信息提交控制器方法里,直接从session取出来源标识:

public function store(Request $request)
{
    // 验证表单数据
    $validated = $request->validate([
        'name' => 'required|string',
        'email' => 'required|email',
        // 其他业务字段...
    ]);

    // 从session获取来源,默认值设为'unknown'兜底
    $source = $request->session()->get('source', 'unknown');

    // 存入数据库(假设你的表有source字段)
    \App\Models\UserInfo::create([
        ...$validated,
        'source_company' => $source,
    ]);

    // 后续跳转或响应逻辑
    return redirect()->route('thank-you');
}

方案2:通过域名/子域名识别来源(更优雅,适合有独立域名的企业)

如果合作企业有自己的独立域名,或者使用你的服务的子域名(比如a.your-service.com),可以直接通过请求域名自动识别来源,不需要额外加URL参数:

修改TrackSource中间件的逻辑:

public function handle(Request $request, Closure $next)
{
    if (!$request->session()->has('source')) {
        $host = $request->getHost();
        // 从数据库匹配对应域名的企业标识
        $company = \App\Models\Company::where('domain', $host)->first();
        if ($company) {
            $request->session()->put('source', $company->identifier);
        }
    }

    return $next($request);
}

这样用户从合作企业的域名跳转过来时,后端会自动识别来源,用户体验更流畅。

方案3:加密来源令牌(防止篡改,更安全)

如果担心用户手动修改URL参数伪造来源,可以用加密令牌的方式,给每个企业生成唯一的加密字符串:

步骤1:生成企业专属令牌

在Company模型里添加生成令牌的方法:

public function generateSourceToken()
{
    return encrypt($this->identifier); // 加密企业唯一标识
}

给每个企业生成令牌后,跳转链接就变成:https://your-laravel-backend.com/register?token=加密后的字符串

步骤2:中间件解密令牌并验证

修改TrackSource中间件:

public function handle(Request $request, Closure $next)
{
    if (!$request->session()->has('source') && $request->has('token')) {
        try {
            $source = decrypt($request->query('token'));
            // 验证来源标识是否合法
            if (\App\Models\Company::where('identifier', $source)->exists()) {
                $request->session()->put('source', $source);
            }
        } catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
            // 令牌无效,可忽略或跳转到错误提示页
        }
    }

    return $next($request);
}

这样即使用户修改令牌,解密会直接失败,无法伪造来源。

额外注意事项

  • Session有效期:如果用户跳转后很久才提交表单,session可能过期,可以考虑把source同时存在cookie里(设置较长有效期),优先读取session,session不存在时读取cookie。
  • 跨域问题:如果合作企业域名和你的Laravel后端域名不同,需要配置CORS确保session/cookie正常传递,推荐用barryvdh/laravel-cors包快速配置。
  • 表单隐藏字段:也可以在页面添加隐藏字段存储source,但不如session可靠,因为用户可能手动修改表单内容。

内容的提问来源于stack exchange,提问作者maximus1127

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:56:24