request::cookie() 读取经框架解密验证的单个或全部 cookie 值,区分大小写,不自动 json 解码;未通过校验的 cookie 会被静默过滤;原生 $_cookie 可绕过解密但无安全校验。

Request::cookie() 读取单个 Cookie 值
ThinkPHP 的 Request 对象提供 cookie() 方法,直接传入键名即可获取解密后的值。它默认走的是框架内置的 Cookie 加密逻辑(基于配置的 cookie_encrypt 和 cookie_httponly),不是原生 $_COOKIE。
常见错误:用 Request::instance()->cookie('user_id') 却读不到——大概率是 Cookie 被加密了但当前请求没走完整生命周期(比如 CLI 环境、或未触发中间件),或者键名拼写/大小写不一致。
- 键名区分大小写,
cookie('Token')≠cookie('token') - 若 Cookie 是通过 JS 设置且未带
path=/或domain,服务端可能因路径不匹配而读不到 - 调试时可用
dump(Request::instance()->cookie())查看全部已解密的键值对
Request::cookie() 不传参时返回全部 Cookie 数组
调用 Request::cookie() 不带参数,会返回一个关联数组,里面是所有**已被框架成功解密并验证签名**的 Cookie 键值对。它不是简单映射 $_COOKIE,而是经过 think\Cookie 类校验后的结果。
注意:如果某个 Cookie 过期、被篡改、或加密密钥不匹配,它会被静默过滤掉,不会出现在这个数组里——这也是为什么有时 $_COOKIE 里有值,但 Request::cookie() 返回空数组。
- 生产环境务必确认
cookie_expire和cookie_key配置一致,否则旧 Cookie 全部失效 - 多子域名共享 Cookie 时,
cookie_domain必须设为.example.com(开头带点),否则跨域读取失败 - 该方法返回的是字符串值,不自动 JSON 解码;若存的是 JSON 字符串,需手动
json_decode()
想绕过解密直接读原始 Cookie 怎么办
某些场景(比如对接第三方系统、调试加密异常)需要跳过 ThinkPHP 的解密流程,直接访问原始 $_COOKIE。这时候不能用 Request::cookie(),得回退到 PHP 原生方式。
但要注意:$_COOKIE 中的值仍是 HTTP 请求头里的原始字符串,可能含 URL 编码、特殊字符,且未做任何完整性校验。
- 推荐写法:
$_COOKIE['remember_token'] ?? null,避免 Notice 报错 - 若值是 URL 编码过的(如
%7B%22id%22%3A1%7D),需手动urldecode() - 绝对不要把
$_COOKIE的值直接用于权限判断——它没签名,可被伪造
Cookie 读取失败的三个高频原因
不是代码写错了,而是环境或配置卡住了。排查优先级建议按以下顺序:
- 检查浏览器 DevTools → Application → Cookies,确认 Cookie 确实存在、未过期、domain/path 匹配当前请求
- 确认
config(cookie.php)中httponly为true(安全前提下),但不影响服务端读取 - 如果是 HTTPS 站点却在 HTTP 下测试,或设置了
secure => true,会导致 Cookie 不发送给服务端
复杂点在于:ThinkPHP 的 Cookie 读取行为高度依赖中间件执行顺序和请求上下文初始化时机。控制器方法里用 Request::cookie() 没问题,但在模型或非请求生命周期中调用,很可能返回空——这时候得确认 Request 实例是否已绑定到容器。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











