跨多域名发送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
相关产品推荐
相关产品推荐

