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

How make PHP session work using subdomain and AJAX?

我在一个使用子域、会话和 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();

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

如果我举个例子运行:

echo $_SESSION["myValue"];

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

我做错了什么?

请参考这篇link。希望对你有所帮助

Setting a cookie on a subdomain from an ajax request

I do not see SESSION vars when calling subdomain script with Jquery (ajax)

谢谢!

如果您的项目是基于 Web 的应用程序,您可以使用一个简单的技巧轻松地在所有域中设置 cookie/session。我确信这适用于 cookie,但从未尝试过会话。让我们做 Google 正在做的事情。创建一个 PHP 文件,在所有 3 个域上设置 cookie。然后在要设置主题的域上,创建一个 HTML 文件,该文件将加载在其他 2 个域上设置 cookie 的 PHP 文件。示例:

<html>
   <head></head>
   <body>
      <p>Please wait.....</p>
      <img src="http://domain2.com/setcookie.php?theme=whateveryourthemehere" />
      <img src="http://domain3.com/setcookie.php?theme=whateveryourthemehere" />
   </body>
</html>

隐藏那些 img 元素,这样如果页面对 user.Then 可见,它就不会在前端显示任何损坏的图像,在 body 标记上添加 onload 回调。只有当图像完全加载时,即在其他 2 个域上设置 cookie 时,文档才会加载。加载回调:

<head>
   <script>
   function loadComplete(){
      window.location="http://domain1.com";//URL of domain1
   }
   </script>
</head>
<body onload="loadComplete()">

我们使用这样的 PHP 文件在其他域上设置 cookie(setcookie.php ) :

<?php
if(isset($_GET['theme'])){
   setcookie("theme", $_GET['theme'], time()+3600);
}
?>

现在在三个域上设置了 cookie:) 并且使用 Web 应用程序您知道如何检索 cookie:)

当然,您可能需要根据您的要求修改此代码。但这肯定会给你一个继续下去的想法

希望对您有所帮助

我已经弄清楚如何进行这项工作了。 Ajax Post方法默认不发送credentials header,需要手动开启:

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

并且在execute.php中你需要输入:

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

如果您从子域请求这个,还需要放在 example.php:

header('Access-Control-Allow-Origin: http://app.example.com');