ThinkPHP6.0操作Cookie需用cookie()函数或Cookie门面,必须显式设置path、domain、secure等参数以确保跨环境兼容;多语言切换须在Lang中间件执行前写入Cookie并重定向,敏感信息应加密且配合服务端验证。

在 ThinkPHP6.0 中操作 Cookie 非常直接,核心是用好 cookie() 辅助函数或 think\facade\Cookie 门面,但必须注意参数完整性与调用时机——尤其在多语言、跨子域或 HTTPS 环境下,漏掉一个 path 或写错 domain 格式,就会导致 Cookie 写不进浏览器或读不出来。
基础设置与读取
最简用法支持快速上手:
- 设置:
cookie('user_name', '张三');—— 使用默认配置(有效期为 session 级、路径为当前请求根路径) - 带有效期:
cookie('token', 'abc123', 3600);—— 第三个参数为秒数 - 读取:
$name = cookie('user_name');或cookie('user_name', null)删除该 Cookie - 清空全部(当前前缀下):
cookie(null);
生产环境必须显式传参
本地开发可能“看起来正常”,但上线后常因路径或域名不匹配失效。务必显式声明关键选项:
-
path 必须为 '/':否则浏览器按当前 URL 路径写入(如
/admin/login下写的 Cookie 只在/admin/下发送),Lang 中间件在根路径就读不到 -
domain 必须以点开头:跨子域共享时写
'.example.com',不能是www.example.com或example.com -
HTTPS 环境下 secure 必须为 true:反向代理(如 Nginx 终止 HTTPS)时,需在
public/index.php开头强制设置$_SERVER['HTTPS'] = 'on';,否则框架检测不到安全协议 - 推荐完整写法:
cookie('think_lang', 'en-us', [<br> 'path' => '/',<br> 'domain' => '.example.com',<br> 'httponly' => true,<br> 'secure' => request()->isSecure(),<br> 'samesite' => 'Lax'<br>]);
多语言切换的正确流程
语言切换不是“设完 Cookie 就生效”,而是涉及中间件执行顺序:
- Lang 中间件在请求最早期运行,读取
$_COOKIE['think_lang']并初始化语言包 - 如果在控制器里才调
cookie('think_lang', ...),本次页面语言已锁定,只影响下一次请求 - 正确做法:用户点击切换语言后,后端立即写入 Cookie + 重定向(非 AJAX 渲染)
例如:return redirect()->to('/'); - 若必须用 AJAX,切换后需手动调
Lang::set('en-us'),但这仅作用于当前请求,不持久
安全与加密配置
ThinkPHP6 默认启用 Cookie 加密,但需确认配置生效:
- 加密开关在
config/app.php的'cookie' => []中开启:'auto_encrypt' => true,并确保'secret_key'已配置(建议 32 位以上随机字符串) - 敏感信息(如登录态)不要只依赖 Cookie,应配合服务端 Session 或 Token 验证
- 避免存密码、手机号等明文;登出时明确删除:
cookie('remember', null); - 启用
httponly => true可防 XSS 窃取,samesite => 'Lax'可缓解 CSRF
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











