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


How make PHP session work using subdomain and AJAX?

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

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

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

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,并通过Ajax返回值,我将得到未定义的索引!

我做错了什么?

我已经知道如何使这个工作。Ajax Post方法默认不发送凭据头,所以我们需要手动启用:

$.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');

请参考此链接。我希望这对你有帮助。

在ajax请求的子域上设置cookie

当使用Jquery (ajax)调用子域脚本时,我没有看到SESSION变量

谢谢!

如果你的项目是基于web的应用程序,你可以很容易地设置cookie/session在所有域用一个简单的技巧。我确信这对cookie有效,但从未尝试过会话。让我们做谷歌正在做的事情。创建一个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元素隐藏,以便它不会显示任何破碎的图像在前端,如果页面是可见的用户。然后在body标签上添加onload回调。只有当图像完全加载时,即在其他2个域上设置cookie时,文档才会加载。Onload Callback:

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

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

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

现在cookie设置在三个域上:)并且对于web应用程序,您知道如何检索cookie:)

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

希望能有所帮助