从子域工作子域但不是ajax请求传递php会话

时间:2018-06-12 06:09:38

标签: javascript php ajax apache

问题

我有一个页面,通过 JavaScript 生成完全。我通过从子域(ajx.example.com)上的 PHP 脚本请求数据来获取内容,然后以 JSON 格式返回。

如果用户已登录(这是 JSON 中的一个键,"isEditable":true),则此特定页面的要求之一是“可编辑”。如果我直接访问请求页面(在子域名上),并且用户已登录(在主域上),则isEditable 始终 true。但是,如果我通过Ajax请求请求它,它始终是false

这些子域名是通过 MAMP 上的 VirtualHost 完成的,并且都指向同一目录。
www.example.com位于htdocs/example
ajx.example.com位于htdocs/example/ajax,和 v1.examplecdn.com位于htdocs/example/cdn

代码

以下是 init 页面(www.example.com/app/init.php

ini_set("session.cookie_domain", ".example.com"); // make sure all sessions are available on all subdomains
error_reporting(E_ALL);
session_start();

// I include the user class here

以下是请求页面(ajx.example.com/request.php):

require_once "../app/init.php"; // (/htdocs/example/app/init.php)
header("Content-type: application/json;charset=utf-8", false);
header("Access-Control-Allow-Origin: http://www.example.com", false);

$user = new User();
$editable = false;

if($user->loggedIn()){ // check if user is logged in (this is stored in a session on .example.com
    $editable = true;
}
die(json_encode(array("isEditable" => $editable)));

这是请求 Ajax v1.examplecdn.com/request.js):

var container = document.getElementById("container");
ajax({
    url: "//ajx.example.com/request.php", // (/htdocs/example/ajax/request.php)
    dataType: "json",
    success: function(res){
        if(res.isEditable){
            console.log("editable"); // this doesn't come through as isEditable is false.
        }
    }
}); 

请求

如果有人能够指出我如何制作它以便可以通过这些子域访问那些 PHP会话,那么非常赞赏!
/> 欢呼声。

1 个答案:

答案 0 :(得分:0)

你是对的,直到这个设置 - ini_set(“session.cookie_domain”,“。example.com”); //确保所有会话都在所有子域上都可用

但由于您在不同的VM上有不同的域,因此无法共享会话,因为每个VM都会创建自己的新会话副本,以允许您需要在DB或缓存服务中保存会话的会话共享,像memcache,redis等。

这里已经解释了

在db表中保存会话

How do I save session data to a database instead of in the file system?