如何使用子域和 AJAX 使 PHP 会话工作?

jNe*_*bie 5 php apache subdomain ajax session

我在一个使用子域、会话和 Ajax 的 PHP 项目中工作。但不幸的是我不能让它工作!我会试着解释:

让我们假设我在这个域:app.mysite.com/index.php

在这个域中,我有一个表单可以向mysite.com/functions/execute.php执行 Ajax 请求(没有任何子域)

execute.php的第一行,我有一个require_once,其中包含一个helper.php文件。在这个文件中,我放了:

ini_set('session.cookie_domain',  '.mysite.com');
session_set_cookie_params(0, '/', '.mysite.com');
session_start();
Run Code Online (Sandbox Code Playgroud)

列出的所有 PHP 文件还包括 helper.php。

例如,如果我运行:

echo $_SESSION["myValue"];
Run Code Online (Sandbox Code Playgroud)

app.mysite.com/index.php或任何其他子域,如auth.mysite.com,我会得到值:"test"。但是如果我在execute.php运行相同的代码,并通过 Ajax 返回值,我将得到未定义的索引!

我究竟做错了什么?

jNe*_*bie 3

我已经弄清楚如何进行这项工作。Ajax Post 方法默认不发送凭据标头,因此我们需要手动启用:

$.ajax({
    method   : "POST",
    url      : "https://example.com/functions/execute.php", 
    data     : myData,
    xhrFields: { 
        withCredentials: true
    }
}).done(function(result) {
    alert("success"));
});
Run Code Online (Sandbox Code Playgroud)

execute.php中你需要输入:

ini_set('session.cookie_domain',  '.example.com');
session_set_cookie_params(0, '/', '.example.com');
session_start();
header('Access-Control-Allow-Credentials: true');
Run Code Online (Sandbox Code Playgroud)

如果您从子域请求此内容,还需要放入example.php

header('Access-Control-Allow-Origin: http://app.example.com');
Run Code Online (Sandbox Code Playgroud)