Laravel 8部署子域名时会话异常,需各子域独立维护会话求助
解决方案:Laravel 8子域名独立会话配置
要让testapp.example.com和app.example.com各自维护独立会话,核心是取消通配符域名的会话共享,为每个子域单独配置会话域名,具体步骤如下:
1. 为每个环境配置专属的SESSION_DOMAIN
Laravel支持通过环境变量区分不同部署环境,直接在各自环境的.env文件中设置会话域名:
- 对于
testapp.example.com,在其.env文件中添加:SESSION_DOMAIN=testapp.example.com - 对于
app.example.com,在其.env文件中添加:SESSION_DOMAIN=app.example.com
同时确保config/session.php中的domain配置项是从环境变量读取的(默认配置即为如此,可检查确认):
'domain' => env('SESSION_DOMAIN', null),
2. 清除浏览器旧Cookie
之前设置的.example.com通配符Cookie会残存在用户浏览器中,可能导致新会话配置不生效。需要让访问者清除对应域名的Cookie,或者在应用中添加逻辑主动清除旧Cookie(可选操作)。
3. 确保会话存储的独立性(可选)
如果两个环境使用了相同的会话驱动(比如Redis、数据库),为避免会话数据冲突,可给每个环境设置独立的会话前缀:
- 在
testapp.example.com的.env中添加:SESSION_PREFIX=laravel_session_testapp - 在
app.example.com的.env中添加:SESSION_PREFIX=laravel_session_app
然后在config/session.php中确保前缀读取环境变量:
'prefix' => env('SESSION_PREFIX', 'laravel_session'),
如果使用文件驱动,要保证两个环境的会话存储目录完全分离,比如分别设置:
// testapp环境的session.php配置 'path' => storage_path('framework/sessions/testapp'), // app环境的session.php配置 'path' => storage_path('framework/sessions/app'),
完成以上配置后,两个子域名的会话就会完全独立,不会互相干扰。
内容的提问来源于stack exchange,提问作者Bharat Godam
相关产品推荐
相关产品推荐

