首页 > 解决方案 > 新窗口从第三方站点返回到我的站点后 PHP 会话发生变化

问题描述

我有一个 PHP 网站www.example.com,它有一个用 JS 打开一个新窗口的按钮。然后它通过 AJAX 加载一个唯一的 urlwww.thirdpartywebsite.com并设置窗口的 url:

var newWindow = window.open("", "_blank", "scrollbars=yes,resizable=yes");
ajax("www.example.com/get-url",
{
    data: someData,
    success: function(response)
    {
        newWindow.location = response.url;
        // something like www.thirdpartywebsite.com/catalog/12345xyz
    }
});

后端 PHP 代码www.example.com/get-url只需向唯一 url 发出 curl 请求www.thirdpartywebsite.com,然后返回它。

返回的第三方站点 url 是一个显示项目目录的页面。每个项目都有一个按钮,将用户重定向回我的站点,并在 POST 中使用项目数据。其 urlwww.example.com/get-data包含以下 PHP 代码:

$itemData = $_POST["data"];
echo '<div id="content-json" style="display:none;">' . json_encode($itemData) . '</div>';
echo '<script>';
echo 'var json = document.getElementById("content-json").innerHTML;';
echo 'var data = JSON.parse(json);';
echo 'window.opener.returnCallback(data);';
echo 'window.close();';
echo "</script>';

returnCallback功能与打开新窗口的按钮位于同一页面(主窗口):

function returnCallback(data)
{
    // Set page's content with data
    // ...
}

所以基本上我们打开一个新窗口到其他站点,用户执行操作,新窗口使用 POST 数据重定向回我的站点,将数据作为 JS 对象提供给主窗口,然后关闭新窗口。

现在的问题是,当新窗口重定向回我的站点时,PHP 会话 ID 会重新生成。我已经通过document.cookie在主窗口的控制台中输入来确认这一点。

在单击按钮打开新窗口之前以及单击新窗口上的按钮以重定向回我的站点之前:

PHPSESSID=random12345

重定向回我的网站并关闭新窗口后:

PHPSESSID=random67890

更有趣的是,这种情况并非每次都发生,也不是每个用户都发生。它有时会在一个用户的一个浏览器上的某一天发生,然后在另一天/时间发生。

我唯一能想到的是域是否在 and 之间发生变化www.example.comexample.com但它总是https://www.example.com.

任何人都知道为什么会发生这种情况?

标签: javascriptphpsessionsession-cookies

解决方案


推荐阅读