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

CORS跨域AJAX请求Set-Cookie失败,PHP会话无法读取问题咨询

问题根因

这是跨域场景下的Cookie同源策略限制导致的:

  • 默认跨域AJAX请求不会携带目标域名的Cookie,也不会保存响应头返回的Set-Cookie到对应域名的本地Cookie存储中
  • 你从https://remotewebsite.com发起的AJAX请求拿到的PHPSESSID仅在本次请求上下文生效,不会写入localhost的Cookie池;你直接访问localhost站点时,浏览器会生成全新的PHPSESSID,自然读不到之前存入的Session数据
可行解决方案

需要同时修改后端响应头配置和前端AJAX请求配置:

后端(localhost站点)修改

  1. 把通配符的CORS配置改成明确指定允许的源,带Cookie的跨域请求不允许Access-Control-Allow-Origin: *:
header("Access-Control-Allow-Origin: https://remotewebsite.com");
  1. 新增允许携带凭证的响应头:
header("Access-Control-Allow-Credentials: true");
  1. 可选补充暴露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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:18:04