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

