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

跨多域名发送Ajax请求时如何维持各域名下PHP会话存活

跨域AJAX请求下PHP会话保持解决方案

根本原因

  • 你配置的Access-Control-Allow-Origin: *不支持携带凭证类信息(包含会话Cookie),浏览器会自动拦截对应Cookie的发送和接收
  • AJAX请求未开启凭证携带配置,域名B的会话ID不会随请求发送到服务端
  • PHP会话Cookie的SameSite属性默认配置不支持跨域传递,导致会话Cookie无法被浏览器携带到跨域接口

具体配置步骤

1. 前端jQuery AJAX请求配置

除crossDomain参数外,需额外开启withCredentials配置允许携带Cookie:

$.ajax({
    url: 'https://域名B的接口地址',
    type: 'POST',
    crossDomain: true,
    xhrFields: {
        withCredentials: true
    },
    // 剩余原有配置:data、success回调等保持不变
})

2. 域名B侧PHP跨域响应头配置

不能使用通配符作为允许的源,需明确指定域名A,同时开启允许凭证的配置:

// 配置允许跨域的信任域名,填写你的域名A
$allowOriginList = ['https://www.domain-a.com'];
$requestOrigin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
if (in_array($requestOrigin, $allowOriginList)) {
    header("Access-Control-Allow-Origin: " . $requestOrigin);
}
// 允许浏览器携带凭证信息
header("Access-Control-Allow-Credentials: true");
// 允许的请求方法,可按需扩展
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
// 允许的请求头,使用非简单请求时需添加对应头名称
header("Access-Control-Allow-Headers: Content-Type");

// 处理OPTIONS预检请求,直接返回200无需走业务逻辑
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    http_response_code(200);
    exit;
}

3. 域名B侧PHP会话Cookie配置

在session_start()之前修改会话Cookie的SameSite属性为None,适配跨域场景:

// 该配置必须放在session_start()之前执行
session_set_cookie_params([
    'lifetime' => 86400, // 按自身业务需求设置会话有效期
    'path' => '/',
    'domain' => 'www.domain-b.com', // 填写你的域名B,无需带http/https前缀
    'secure' => true, // 生产环境HTTPS必须开启,本地HTTP测试可临时设为false
    'httponly' => true, // 建议开启,防止XSS攻击窃取Cookie
    'samesite' => 'None' // 跨域场景必须设为None
]);
session_start();

注意事项

  • 生产环境必须保证域名A和域名B都使用HTTPS协议,SameSite=None属性仅在HTTPS环境下生效
  • 禁止使用通配符*作为Access-Control-Allow-Origin的值,必须明确指定信任的域名,否则浏览器会拒绝携带Cookie
  • 如使用自定义请求头,需要在Access-Control-Allow-Headers配置中添加对应的头名称,否则预检请求会失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:27:04