【发布时间】:2017-11-22 04:25:00
【问题描述】:
我有域 jdavis.software 并有两个子域 om.jdavis.software 和 api.jdavis.software。我只是尝试从om 到设置$_SESSION 变量的api 进行异步(ajax)调用,然后重新加载相同的om 页面并显示会话。我在 php.ini 中设置了session.cookie_domain = .jdavis.software,以便会话创建来自同一个根域。
域:
Apache vhost 配置:(用于子域及其相关目录)
AllowOverride All
Header set Access-Control-Allow-Credentials "true"
Header set Access-Control-Allow-Origin "*"
api.jdavis.software/test.php
<?php
session_start();
function test(){
$_SESSION['test'] = 123;
}
test();
print_r($_SESSION);
exit();
?>
om.jdavis.software/index.php
<?php
session_start();
print_r($_SESSION);
?>
<!DOCTYPE html>
<html>
<head>
<script>
var ajax = function(data){
http = new XMLHttpRequest();
http.open((data.method) ? data.method : "POST", (data.url) ? data.url : "/");
http.send(data.params);
http.onreadystatechange=()=>{
if(http.status != 404){
http.addEventListener("load", data.callback);
}
else{
console.log("Error: Issue with server call...");
}
}
};
function submitForm(form) {
var form = new FormData(form);
ajax({
url: "http://api.jdavis.software/test.php",
method: "POST",
params: form,
callback: function(e){
console.log(e.target.response);
}
});
event.stopPropagation();
event.preventDefault();
return false;
};
</script>
</head>
<body>
<form onSubmit="submitForm(this);">
<input type="submit">
</form>
</body>
</html>
sessions_id 是相同的,当我 print_r($_SESSION) 在我运行 ajax 调用并重新加载页面后,没有任何东西打印甚至 id...
问题:为什么$_SESSION 变量没有打印出来?
【问题讨论】:
-
您需要向我们展示所有相关代码。请阅读:How to create a Minimal, Complete, and Verifiable example 和 How do I ask a good question?
-
@MagnusEriksson 在身份验证成功后,我的代码中的字面意思是
$_SESSION['test'] = 123,cookie(session_id)在两者上都是相同的,但是当我var_dump($_SESSION)没有打印出来时。 -
您是否设置了会话 cookie 域以匹配子域?在设置/读取
$_SESSION超级全局之前你有session_start()吗?您是否在 Google 上搜索过“跨子域的 php 会话”?当我们看不到代码时,问题是我们不知道你已经/没有做过什么,我们需要开始猜测或询问每一件事。 -
@MagnusEriksson 是的,我在
.htaccess文件中设置了根域.domain.com和两个子域上的会话 ID 匹配。
标签: php session cross-domain session-cookies