如何使用子域和 AJAX 使 PHP 会话工作?
How make PHP session work using subdomain and AJAX?
我在一个使用子域、会话和 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,我会得到值:"test"。
但是,如果我 运行 execute.php 处的相同代码和 return 通过 Ajax 的值,我将得到未定义的索引!
我做错了什么?
请参考这篇link。希望对你有所帮助
Setting a cookie on a subdomain from an ajax request
I do not see SESSION vars when calling subdomain script with Jquery (ajax)
谢谢!
如果您的项目是基于 Web 的应用程序,您可以使用一个简单的技巧轻松地在所有域中设置 cookie/session。我确信这适用于 cookie,但从未尝试过会话。让我们做 Google 正在做的事情。创建一个 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
元素,这样如果页面对 user.Then 可见,它就不会在前端显示任何损坏的图像,在 body 标记上添加 onload 回调。只有当图像完全加载时,即在其他 2 个域上设置 cookie 时,文档才会加载。加载回调:
<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:)
当然,您可能需要根据您的要求修改此代码。但这肯定会给你一个继续下去的想法
希望对您有所帮助
我已经弄清楚如何进行这项工作了。 Ajax Post方法默认不发送credentials header,需要手动开启:
$.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 的 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,我会得到值:"test"。 但是,如果我 运行 execute.php 处的相同代码和 return 通过 Ajax 的值,我将得到未定义的索引!
我做错了什么?
请参考这篇link。希望对你有所帮助
Setting a cookie on a subdomain from an ajax request
I do not see SESSION vars when calling subdomain script with Jquery (ajax)
谢谢!
如果您的项目是基于 Web 的应用程序,您可以使用一个简单的技巧轻松地在所有域中设置 cookie/session。我确信这适用于 cookie,但从未尝试过会话。让我们做 Google 正在做的事情。创建一个 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
元素,这样如果页面对 user.Then 可见,它就不会在前端显示任何损坏的图像,在 body 标记上添加 onload 回调。只有当图像完全加载时,即在其他 2 个域上设置 cookie 时,文档才会加载。加载回调:
<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:)
当然,您可能需要根据您的要求修改此代码。但这肯定会给你一个继续下去的想法
希望对您有所帮助
我已经弄清楚如何进行这项工作了。 Ajax Post方法默认不发送credentials header,需要手动开启:
$.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');