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

跨子域发起XMLHttpRequest请求如何实现目标子域cookie持久化?

解决方案

跨子域请求属于跨源请求,默认浏览器不会自动携带目标域的Cookie,也不会保存响应返回的Cookie,要实现Cookie持久生效需要做以下配置:

1. 调整前端XMLHttpRequest配置

在open方法之后、send方法之前添加withCredentials属性设置为true,允许请求携带和保存跨域Cookie:

var url = "https://www.example.com/page.php?param=value"
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", url, false );
// 新增这行配置
xmlHttp.withCredentials = true;
xmlHttp.send( null );

2. 配置目标子域的CORS响应头

在目标子域的PHP代码顶部添加以下响应头配置:

  • 必须明确指定允许的源站,不能使用*通配符,替换为你实际发起请求的源子域地址
  • 开启允许跨域携带Cookie的配置
// 替换为实际的源子域地址,例如https://origin.example.com
header('Access-Control-Allow-Origin: https://你的源子域地址');
header('Access-Control-Allow-Credentials: true');
// 处理OPTIONS预检请求
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    exit;
}

3. 调整目标子域Cookie的配置

PHP设置Cookie时,需要指定正确的domain、SameSite等属性,保证Cookie能在多个子域间共享、跨请求保留:

// 示例:配置会话Cookie,domain填根域名,前面带.适配所有子域
session_set_cookie_params([
    'domain' => '.example.com', // 替换为你的根域名
    'path' => '/',
    'secure' => true, // 必须开启,仅HTTPS环境下生效
    'httponly' => true,
    'samesite' => 'None' // 跨域场景必须设置为None
]);
session_start();

// 普通Cookie设置同理
setcookie('你的Cookie名', 'Cookie值', time() + 86400, '/', '.example.com', true, true, ['samesite' => 'None']);

注意事项

  • 所有关联站点必须使用HTTPS协议,否则SameSite=None和secure属性不生效,无法携带跨域Cookie
  • 不需要修改源子域的任何Cookie/会话配置,仅调整上述前端和目标子域的配置即可生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:15:04