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
相关产品推荐
相关产品推荐

