PHP 在 POST 之后重定向

PHP redirect after POST

我正在与 google sign-in 一起工作,并且大部分时间都在那里。用户成功登录,我可以访问我的 mysql 用户 table 来查找用户记录。 在完成用户处理并设置 $_SESSION 变量后,我想从 POST 页面重定向回我的 index.php 页面。我知道 POST 页面正在执行,但重定向不起作用,我没有看到任何错误(例如“无法修改 header 信息 - header 已发送”。

login.php 包含 google sign-in 按钮并在 includes/oauth.js

中调用一个 js 函数
...
    <script src="https://apis.google.com/js/platform.js" async defer></script>
    <script src="includes/oauth.js"></script>
</head>
<body>
    <div id="content">
    <div class="g-signin2" data-longtitle="true" data-onsuccess="onSignIn"></div>
...

onSignIn 函数负责 sign-in 进程并检索用户详细信息。它还准备 POST 调用,包括身份验证令牌

...
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'includes/oauth.php');
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send('idtoken=' + id_token);
...

includes/oauth.php 文件获取令牌并对其进行验证。获取 userId,在我的数据库中查找并准备 session 变量。此时,它应该重定向,但没有。我很难过。这是因为我对 POST?

使用了 XMLHttpRequest()
<?php
session_start();
...
if (isset($_POST['idtoken'])){
...
                $_SESSION["auth"] = true;
                $_SESSION["userId"] = $row['id'];
                $_SESSION["userName"] = $row['name'];
                header("Location: ../index.php");
                exit();
}
...

我更新了 includes/oauth.js 文件如下:

var xhr = new XMLHttpRequest();
    xhr.open('POST', 'includes/oauth.php');
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onreadystatechange = function() {
        window.location = "../index.php";
    xhr.send('idtoken=' + id_token);

现在一切正常!

也许,页面会一直持续到load/process而不会结束?我正在研究一个类似的 Cookie/post 相关问题,它可能是一个类似的解决方案。在我的例子中,我不得不使用 cookie_write_close() 因为我会设置依赖于当前 session_start() 上下文的 cookie。在添加 cookie_write_close() 之前,php 进程将保持打开状态并且不会发生重定向加载。相反,页面会根据服务器超时设置超时。