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

跨域POST请求生成新Session ID后,重定向时无法携带该ID的问题咨询

跨域POST请求生成新Session ID后,重定向时无法携带该ID的问题咨询

各位好,我最近碰到一个跨域会话的棘手问题,想请大家帮忙排查下:

我需要从from.com通过AJAX发送跨域POST请求到to.com/process.php,目的是提交表单数据后,在to.com端创建一个新的PHP会话(生成新的PHPSESSID Cookie),然后通过JavaScript重定向到to.com/order.php。但奇怪的是,重定向到order.php后,服务器拿到的却是旧的/错误的会话ID,完全不是process.php刚生成的那个新ID。

目前的代码实现:

1. from.com 端的AJAX请求代码

$.ajax({
    type: "POST",
    url: "https://to.com/process.php",
    data: $("#myForm").serialize(),
    xhrFields: {
        withCredentials: true  // 允许携带Cookie发送请求
    },
    success: function (response) {
        window.location.href = "https://to.com/order.php";
    }
});

2. to.com/process.php 代码

<?php
header('Access-Control-Allow-Origin: https://from.com');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, X-Requested-With');

// 处理预检OPTIONS请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

ini_set('session.use_strict_mode', 1);
session_start();
session_regenerate_id(true);

setcookie(
    'PHPSESSID',
    session_id(),
    [
        'expires' => time() + 3600,
        'path' => '/',
        'domain' => 'to.com',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'None'
    ]
);

$_SESSION['user'] = 'John Doe';
error_log("New Session ID in process.php: " . session_id());

echo json_encode(["status" => "success"]);
exit;
?>

3. to.com/order.php 代码

<?php
ini_set('session.use_strict_mode', 1);

session_start();

error_log("order.php - Received Session ID: " . session_id());
error_log("order.php - Received Cookie: " . ($_COOKIE['PHPSESSID'] ?? 'N/A'));
error_log("order.php - Session Data: " . print_r($_SESSION, true));

if (!isset($_SESSION['user'])) {
    echo "Session validation failed.";
    exit;
} else {
    echo "Session is valid!";
}
?>

已确认的现象:

我通过调试确认,process.php的响应头里确实正确返回了Set-Cookie字段,携带了新生成的PHPSESSID。但重定向到order.php后,浏览器发送的请求里带的却是旧的会话ID,导致order.php里的$_SESSION['user']根本不存在,验证失败。

我的疑问:

为什么跨域POST请求生成的新会话ID,没办法在后续的JavaScript重定向中被正确携带?我该做哪些调整,才能让新的会话ID在重定向后正常生效呢?

备注:内容来源于stack exchange,提问作者kviktor1230

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:32:58