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

React调用PHP API获取数据时Session丢失问题求助

解决React fetch调用PHP API时Chrome无法保持Session ID的问题

问题现象

React通过fetch()跨站调用PHP后端API时,每次请求返回的Session ID都是新的。Firefox中能正常携带PHPSESSID Cookie并保持Session稳定,但Chrome无法保持;直接在浏览器单独打开API路径时Session正常,说明问题出在跨站fetch请求的Cookie处理逻辑上。

核心原因

Chrome对跨站Cookie的SameSite属性有严格限制:PHP默认的Session CookieSameSite属性为Lax,跨站POST请求不会携带这类Cookie;而Firefox的默认规则相对宽松,因此能正常工作。要让Chrome在跨站请求中携带Session Cookie,需将PHP Session Cookie的SameSite属性设置为None,同时必须开启Secure属性(仅HTTPS环境有效,你的请求已符合HTTPS要求)。

解决方案

1. PHP端配置Session Cookie属性

两种配置方式任选其一即可:

方式一:代码中动态设置(推荐,无需修改php.ini)

在session_start()之前,通过session_set_cookie_params()覆盖默认Cookie参数:

<?php
// 先配置Session Cookie参数,再启动Session
$defaultParams = session_get_cookie_params();
session_set_cookie_params([
    'lifetime' => $defaultParams['lifetime'],
    'path' => $defaultParams['path'],
    'domain' => $defaultParams['domain'],
    'secure' => true, // SameSite=None必须配合Secure属性(HTTPS环境)
    'httponly' => $defaultParams['httponly'],
    'samesite' => 'None' // 关键配置,允许跨站请求携带Cookie
]);

session_start();
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Origin: http://localhost:5173');
header('Content-Type: application/json; charset=utf-8');

$data = json_decode(trim(file_get_contents("php://input")));
$return = array();

$return["sessionID"] = session_id();

echo json_encode($return);
?>

方式二:修改php.ini全局配置

找到php.ini中的对应配置项,修改为:

session.cookie_secure = On
session.cookie_samesite = None

修改后重启PHP服务生效。

2. React fetch请求保持现有配置即可

你的React代码已正确设置credentials: "include",这是跨站请求携带Cookie的必要配置,无需修改:

useEffect(() => {
  const fetchConfig = async () => {
    const data = await (
      await fetch(apiPath, {
        credentials: "include",
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          action: "getConfig",
        }),
      })
    ).json();

    console.log(data);
  };

  fetchConfig();
}, []);

验证

修改完成后重新测试Chrome请求,查看请求头是否携带Cookie: PHPSESSID=xxx,此时Session ID应保持稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:32:51