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

基于单个Laravel应用的多站点能否设置不同Session生命周期?

当然可以实现!

在单个Laravel应用中为不同站点配置差异化的Session生命周期,核心思路是动态修改Session配置,结合请求的站点标识(比如域名)来区分处理。下面是具体的实现步骤,亲测有效:

1. 生成自定义Session生命周期中间件

首先创建一个中间件,用来根据当前访问的站点调整Session过期时间:

php artisan make:middleware SetSiteSessionLifetime

打开生成的app/Http/Middleware/SetSiteSessionLifetime.php,编写逻辑:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class SetSiteSessionLifetime
{
    public function handle(Request $request, Closure $next)
    {
        // 按域名区分站点,你也可以用其他标识(比如子路径、请求头)
        $currentDomain = $request->getHost();

        // 为不同站点设置不同的Session有效期(单位:分钟)
        match ($currentDomain) {
            'site1.yourdomain.com' => config(['session.lifetime' => 120]), // 2小时
            'site2.yourdomain.com' => config(['session.lifetime' => 525600]), // 1年(约525600分钟)
            default => null, // 默认使用config/session.php里的配置
        };

        return $next($request);
    }
}

2. 注册中间件并调整执行顺序

打开app/Http/Kernel.php,把自定义中间件加到web中间件组里,必须放在StartSession中间件之前——这样修改的配置才能在Session初始化时生效:

protected $middlewareGroups = [
    'web' => [
        // ...其他中间件
        \App\Http\Middleware\SetSiteSessionLifetime::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // ...其他中间件
    ],
];

如果你只想为特定路由组应用这个规则,也可以把中间件注册为路由中间件:

protected $routeMiddleware = [
    // ...其他路由中间件
    'set-session-lifetime' => \App\Http\Middleware\SetSiteSessionLifetime::class,
];

然后在路由组里调用:

Route::domain('site1.yourdomain.com')->middleware('set-session-lifetime')->group(function () {
    // site1的所有路由
});

Route::domain('site2.yourdomain.com')->middleware('set-session-lifetime')->group(function () {
    // site2的所有路由
});

3. 补充配置注意事项

  • 如果使用Cookie作为Session驱动,确保config/session.php里的expire_on_close设置为false,否则浏览器关闭后Session会立即失效,覆盖你的长期有效期设置。
  • 对于长期Session(比如1年),建议开启secure(仅HTTPS下传输Cookie)和same_site(限制Cookie跨站发送),提升安全性:
// config/session.php
'secure' => env('SESSION_SECURE_COOKIE', true),
'same_site' => 'lax',
  • 如果你用的是Redis、数据库等服务器端Session驱动,动态修改的lifetime也会同步控制服务器端Session的过期清理逻辑。

4. 测试验证

分别访问两个站点,打开浏览器开发者工具查看Cookie的过期时间:

  • site1的Session Cookie应该显示2小时后过期
  • site2的Session Cookie应该显示1年后过期

如果没生效,先清除浏览器缓存和应用的Session缓存(php artisan cache:clear),再重新测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:58:48