我正在使用子域,会话和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返回值,我将获得未定义的索引!
我做错了什么?
答案 0 :(得分:1)
请参阅此链接。我希望它会对你有所帮助。
Setting a cookie on a subdomain from an ajax request
I do not see SESSION vars when calling subdomain script with Jquery (ajax)
谢谢!
答案 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');