Laravel 10 Session与Cookie配置核心是选对驱动、设好跨子域作用域(SESSION_DOMAIN=.example.com)、匹配安全参数(SESSION_SECURE=true、SAMESITE=None等);必须用response()->cookie()写入、request()->cookie()读取,禁用$_COOKIE;CORS需启用supports_credentials且allowed_origins不可为*。

配置 Laravel 10 的 Session 和 Cookie,核心是三件事:选对驱动、设好作用域(尤其是跨子域)、确保安全参数匹配运行环境。本地开发和生产环境差异大,很多问题其实出在配置没对齐,而不是代码写错。
Session 驱动与基础参数
打开 config/session.php,关键项有:
-
driver:默认
'file',适合开发;上线建议用redis(快、支持分布式)。改完记得在.env中同步:SESSION_DRIVER=redis - lifetime:单位是分钟,默认 120(2 小时)。可按需调整,比如后台登录设为 480(8 小时)
-
expire_on_close:设为
true时,浏览器关闭即失效(会话级 Cookie),适合敏感操作 - encrypt:Laravel 10 默认开启加密,不建议关。它保护 session 数据不被客户端篡改
跨子域 Session 共享(关键!)
如果你的前端在 app.example.com,API 在 api.example.com,但用户一刷新就登出,大概率是 SESSION_DOMAIN 没配对。
- 在
.env中必须写成:SESSION_DOMAIN=.example.com(开头那个点不能少) - 同时配好:
SESSION_SECURE=true(强制 HTTPS)、SESSION_HTTP_ONLY=true、SESSION_SAMESITE=None - 如果用 HTTPS,Nginx 或 Apache 不能覆盖
Set-Cookie头;检查有没有类似add_header Set-Cookie ...的粗暴配置
Cookie 的写入与读取规范
Laravel 的 Cookie 默认加密签名,不能用原生 setcookie() 或 $_COOKIE 操作。
- 写入必须走响应对象:
return response('OK')->cookie('token', 'abc', 60, '/', null, true, true, false, 'Lax'); - 参数顺序固定:
name、value、minutes、path、domain、secure、httpOnly、raw、sameSite。漏掉minutes就变成会话级 Cookie - 读取只能用:
request()->cookie('token')或Cookie::get('token');$_COOKIE['token']拿到的是加密乱码,无效 - 本地开发若用
localhost:3000调后端,domain留null即可,别硬填.localhost(新版 Chrome 支持,但旧版或某些系统仍不稳定)
CORS 与凭据支持
前端带 Cookie 请求 API 时,后端 CORS 配置必须配合,否则浏览器直接拦截 Set-Cookie。
- 安装并配置
fruitcake/laravel-cors,config/cors.php中设:'supports_credentials' => true -
'allowed_origins'必须列明具体域名,例如['https://app.example.com', 'http://localhost:3000'];禁止写['*'] - 前端 fetch 要加:
{ credentials: 'include' };Axios 则设withCredentials: true - CSRF Token 实际从
laravel_session解密而来,Session 拿不到,XSRF-TOKEN 自然失效——所以 Session 和 CSRF 是绑定的,不是两个独立机制


















