CORS跨域AJAX请求Set-Cookie失败,PHP会话无法读取问题咨询
问题根因
这是跨域场景下的Cookie同源策略限制导致的:
- 默认跨域AJAX请求不会携带目标域名的Cookie,也不会保存响应头返回的
Set-Cookie到对应域名的本地Cookie存储中 - 你从
https://remotewebsite.com发起的AJAX请求拿到的PHPSESSID仅在本次请求上下文生效,不会写入localhost的Cookie池;你直接访问localhost站点时,浏览器会生成全新的PHPSESSID,自然读不到之前存入的Session数据
可行解决方案
需要同时修改后端响应头配置和前端AJAX请求配置:
后端(localhost站点)修改
- 把通配符的CORS配置改成明确指定允许的源,带Cookie的跨域请求不允许
Access-Control-Allow-Origin: *:
header("Access-Control-Allow-Origin: https://remotewebsite.com");
- 新增允许携带凭证的响应头:
header("Access-Control-Allow-Credentials: true");
- 可选补充暴露Set-Cookie头的配置,避免低版本浏览器拦截:
header("Access-Control-Expose-Headers: Set-Cookie");
前端(remotewebsite.com站点)AJAX请求修改
需要开启跨域携带凭证的配置,不同请求工具的配置方式如下:
- 原生XMLHttpRequest:
const xhr = new XMLHttpRequest(); xhr.withCredentials = true; // 其余请求逻辑不变
- fetch API:
fetch('http://localhost/?param=ThisIsImportant', { credentials: 'include', // 其余请求配置不变 })
- axios:
axios.get('http://localhost/?param=ThisIsImportant', { withCredentials: true })
注意事项
- 开发阶段如果
remotewebsite.com的域名、端口有变动,需要同步更新后端Access-Control-Allow-Origin的配置值 - 部分高版本浏览器会拦截HTTPS站点发起的HTTP请求(混合内容限制),如果遇到拦截可以给localhost本地服务配置自签名证书,改用HTTPS协议访问
- 该方案仅适用于本地开发测试,不要直接用于生产环境
内容的提问来源于stack exchange,提问作者LessStress
相关产品推荐
相关产品推荐

