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

时间:2016-09-28 03:35:08

标签: php ajax apache session subdomain

我正在使用子域,会话和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 ,我会得到以下值:“测试“即可。 但是如果我在 execute.php 运行相同的代码,并通过Ajax返回值,我将获得未定义的索引!

我做错了什么?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

如果您的项目是基于Web的应用程序,您可以通过简单的技巧轻松地在所有域中设置cookie /会话。我确定这适用于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回调:

<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:)

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

希望这有帮助

答案 2 :(得分:1)

我已经弄清楚如何使这项工作。默认情况下,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');