SameSite=None必须同时设置secure=true且在session_start()前调用;PHP 7.4+默认Lax,domain需以点开头(如'.example.com')才能跨子域共享。

session.cookie_samesite = 'None' 必须搭配 secure = true
PHP 7.4+ 默认启用 SameSite=Lax 行为(即使没显式配置),浏览器会拒绝把 Cookie 发给跨域请求,除非你明确设为 None 且强制走 HTTPS。只写 ini_set('session.cookie_samesite', 'None'); 不生效——它会被浏览器直接丢弃。
必须同步设置 secure 标志:
-
ini_set('session.cookie_secure', 1);(或true) ini_set('session.cookie_samesite', 'None');- 这两行都得在
session_start()之前调用
漏掉 secure 或在 HTTP 环境下启用 SameSite=None,Chrome/Firefox 会静默忽略该 Cookie,DevTools 的 Application → Cookies 里根本看不到它。
session_set_cookie_params() 调用时机比 ini_set() 更容易出错
很多人用 session_set_cookie_params() 设置 samesite,但这个函数必须在 session_start() 前调用,且参数数组必须包含 'samesite' 键,不能只传前两个参数。
立即学习“PHP免费学习笔记(深入)”;
正确写法:
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'None'
]);
session_start();
常见错误:
- 在 ThinkPHP 中间件里调用——此时响应头已部分发出,
session_set_cookie_params()失效 - 传参用
session_set_cookie_params(0, '/', '.example.com')这种老式写法,samesite和secure完全没被设置 - 用
setcookie()手动覆盖 Session Cookie,但没带samesite属性,导致浏览器按默认策略处理
PHP 7.4 的 session.cookie_samesite 默认值不是空字符串
PHP 7.4 引入了对 SameSite 的原生支持,默认行为等价于 ini_set('session.cookie_samesite', 'Lax');。也就是说,哪怕你完全没配,浏览器也会按 Lax 规则限制跨站请求发 Cookie。
验证方式:在 session_start() 后立刻 var_dump(session_get_cookie_params());,看输出里 'samesite' 是什么值。如果是 '' 或 null,说明配置未生效;如果是 'Lax',说明正在走默认策略。
注意:php.ini 里写 session.cookie_samesite =(空值)在 PHP 7.4+ 不等于禁用,而是触发 fallback 到 Lax。
子域名共享时 domain 值开头的点不能少
session.cookie_domain 设成 'example.com' 和 '.example.com' 效果完全不同:前者只匹配精确域名,后者才匹配所有子域名(shop.example.com、api.example.com 等)。
必须写成:
-
ini_set('session.cookie_domain', '.example.com');(注意开头的点) - 或在
session_set_cookie_params()数组里写'domain' => '.example.com'
如果漏掉点,浏览器只会把 Cookie 发给当前完整主机名(比如 shop.example.com),其他子域收不到,SameSite 配再对也没用。
跨域共享真正卡住的地方,往往不是 samesite 本身,而是 domain 写错 + secure 没配 + 调用时机晚 —— 三者只要一个没到位,Cookie 就不会出现在目标域的请求头里。



















