You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AJAX请求下PHP7.4及以上版本无法删除指定Cookie问题求助

问题核心原因

这确实是PHP 7.4及以上版本的默认安全配置变更导致的问题:PHP 7.4开始将Cookie的SameSite属性默认值设为Lax,该规则会限制非同源的AJAX/POST请求携带Cookie,具体匹配你遇到的现象:

  • 旧版本PHP 7.2/7.3没有默认设置SameSite属性,浏览器默认允许跨站请求携带无SameSite标记的Cookie,所以原有逻辑正常
  • 你当前只有PHPSESSID能被AJAX请求获取,大概率是站点会话配置单独给PHPSESSID做了跨站兼容,剩余的XSRF-TOKEN、MY_APP_SESSION走PHP默认的Cookie配置,因此不会被跨站请求携带
  • 登出时删除Cookie也需要完全匹配Cookie的domain、path、SameSite、Secure属性,属性不匹配就无法成功删除Cookie
解决方案

方案1:全局修改PHP配置(所有Cookie默认生效)

修改php.ini中的以下配置,仅HTTPS环境可使用SameSite=None:

session.cookie_samesite = "None"
session.cookie_secure = On
session.cookie_httponly = On
; 非会话类Cookie的默认SameSite配置
cookie.samesite = "None"

修改后重启PHP-FPM或Web服务器即可生效。

方案2:单独给指定Cookie配置属性(更灵活,无需修改全局配置)

PHP 7.3及以上版本的setcookie函数支持传入options数组,在设置XSRF-TOKEN、MY_APP_SESSION时显式指定跨站属性即可:

// 设置MY_APP_SESSION示例
setcookie('MY_APP_SESSION', $session_value, [
    'expires' => time() + 86400,
    'path' => '/',
    'domain' => '.your-root-domain.com', // 替换为你所有站点的公共根域名
    'secure' => true, // SameSite=None要求必须启用HTTPS
    'httponly' => true,
    'samesite' => 'None'
]);

// XSRF-TOKEN设置逻辑同理
setcookie('XSRF-TOKEN', $xsrf_value, [
    'expires' => time() + 86400,
    'path' => '/',
    'domain' => '.your-root-domain.com',
    'secure' => true,
    'samesite' => 'None'
]);

登出销毁Cookie时需要使用完全相同的属性参数才能成功删除:

// 删除Cookie示例
setcookie('MY_APP_SESSION', '', [
    'expires' => time() - 3600,
    'path' => '/',
    'domain' => '.your-root-domain.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'None'
]);

方案3:同根域名场景下的更安全配置

如果所有SSO站点都属于同一根域名下的子站(比如a.example.com、b.example.com),不需要跨顶级域名,可以将SameSite设为Lax,同时把Cookie domain设为根域名.example.com,安全性更高,也能满足同根域名下的SSO请求携带Cookie需求。

内容的提问来源于stack exchange,提问作者JG.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:54:01