我在一个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:)
当然,您可能需要根据您的需求修改这段代码。但是这个这肯定会给你一个继续的想法
希望能有所帮助