ThinkPHP跨子域共享语言Cookie需配置cookie_domain为'.example.com',HTTPS下还需启用cookie_secure=true,并通过cookie()函数或Cookie::set()传domain参数确保生效。

ThinkPHP 设置语言 Cookie 的域名,核心是让 think_lang(或多语言 Cookie 名)能跨子域生效,比如从 www.example.com 登录后,在 api.example.com 或 admin.example.com 也能读取到用户选择的语言。
语言 Cookie 的域名配置位置
语言功能本身由 ThinkPHP 的多语言组件驱动,其底层仍依赖标准 Cookie 机制。所以设置域名不是在 lang.php 里改,而是统一走 Cookie 全局配置:
- TP6:修改
config/app.php,添加或修改'cookie_domain' => '.example.com' - TP5.1/5.0:修改
config.php或config/cookie.php,同样设'cookie_domain' => '.example.com'
注意:必须以点开头(如 .example.com),不能写 example.com 或 www.example.com,否则无法跨子域共享。
确保语言 Cookie 实际写入时带域名
即使全局配置了 cookie_domain,某些场景下(如手动调用 cookie('think_lang', 'en-us'))仍需确认该操作受配置影响。建议:
立即学习“PHP免费学习笔记(深入)”;
- 统一使用
cookie()函数操作语言 Cookie,它会自动读取cookie_domain配置 - 避免直接用原生
setcookie(),否则容易遗漏domain参数 - 若用
Cookie::set(),务必传数组选项,例如:Cookie::set('think_lang', 'en-us', ['domain' => '.example.com'])
HTTPS 环境下的额外要求
如果站点启用 HTTPS,还需同步开启安全标识,否则浏览器可能拒绝发送该 Cookie:
- 在
config/app.php中补充:'cookie_secure' => true - 同时确保
'cookie_httponly' => true和'cookie_samesite' => 'Lax'也已合理设置 - 若服务端强制 HTTPS(如 Nginx 重定向),
cookie_secure必须为true,否则语言 Cookie 不会被携带
验证是否生效
设置完成后,打开浏览器开发者工具(Application → Cookies),检查 think_lang 对应的 Cookie 是否满足:
-
Domain 显示为
.example.com(带前导点) - Secure 列为 ✅(HTTPS 下)
- 在不同子域页面(如
user.example.com和blog.example.com)都能通过cookie('think_lang')正确读取值
不复杂但容易忽略



















