我知道this question has been asked before所以我提前道歉,但我已经多次解决了他的解决方案,并没有解决我的情况下的会话重置。
我有一个简单的php页面,它输出一个用于调试的会话ID。像这样:
<?php
session_start();
echo session_id();
?>
然后我有一个简单的HTML页面jQuery
,在该页面上执行ajax
请求并记录输出。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$.post('http://localhost.api.mydomain/sid', {
some: 'data'
}, function(data,status) {
console.log(data);
});
</script>
</head>
<body>
Check your console.
</body>
</html>
如果我手动访问网址http://localhost.api.mydomain/sid
,输出永远不会改变,session_id()
将保持不变,如预期的那样。但是,如果我刷新ajax页面,则每次刷新时输出的session_id()
都会发生变化。
我已尝试在session.cookie_domain
文件中设置php.ini
,但无济于事。我为这个问题道歉,但我找不到解决办法。
答案 0 :(得分:2)
这是Access-Control
问题,而不是ajax
问题。
当您直接从浏览器访问网址时,您正在从您正在访问的域中请求(会话)Cookie。当您使用ajax
时,在这种情况下,您要求的域名不是您正在访问的域名。
在api.example.com
的php API文件中,试试这个。
header('Access-Control-Allow-Origin: example.com');
header('Access-Control-Allow-Credentials: true');
然后在您的ajax
请求文件中,使用xhrFields
参数,如此。
$.ajax({
url: 'https://api.example.com',
xhrFields: { withCredentials: true },
success: function(data) {
console.log(data)
}
});
现在,只要您从原始example.com
调用请求,Cookie就会按预期运行。
答案 1 :(得分:1)
原因是因为ajax请求不会随请求一起发送会话ID。这会导致session_start
生成一个新的。
可能导致浏览器在ajax请求期间未发送会话cookie的原因是域名不一致。
而不是在ini文件中设置session.cookie_domain,在运行时将其设置如下
session_set_cookie_params(33600, '/', 'localhost.api.mydomain', FALSE, TRUE);
session_start();
为了帮助您调试,请转到chrome中的开发人员工具上的网络选项卡。重新加载页面并检查请求标头和响应标头。检查jquery发送请求的主机。它可能正在将请求发送到localhost。并且您可能已将站点配置为接受localhost和localhost.api.mydomain。
在您的文件中执行更多检查,执行类似
的操作session_set_cookie_params(33600, '/', 'localhost.api.mydomain', FALSE, TRUE);
session_start();
die($_SERVER['HTTP_HOST']);
这将允许您比较jjery在ajax请求期间使用的请求URL。