Ajax重置PHP会话
我知道,所以我提前道歉,但我已经检查了他的解决方案多次,在我的情况下,它并没有修复会话重置 我有一个简单的php页面,输出一个会话id进行调试。像这样:Ajax重置PHP会话,php,ajax,session,session-variables,session-cookies,Php,Ajax,Session,Session Variables,Session Cookies,我知道,所以我提前道歉,但我已经检查了他的解决方案多次,在我的情况下,它并没有修复会话重置 我有一个简单的php页面,输出一个会话id进行调试。像这样: <?php session_start(); echo session_id(); ?> 如果我手动访问urlhttp://localhost.api.mydomain/sid输出永远不会改变,会话id()保持不变,正如预期的那样。但是,如果我刷新ajax页面,输出的session\u id()会随着每次刷新而改变 我尝试在php
<?php
session_start();
echo session_id();
?>
如果我手动访问urlhttp://localhost.api.mydomain/sid
输出永远不会改变,会话id()
保持不变,正如预期的那样。但是,如果我刷新ajax页面,输出的session\u id()
会随着每次刷新而改变
我尝试在
php.ini
文件中设置session.cookie\u域
,但没有效果。对此问题,我深表歉意,但我无法找到解决方案。原因是ajax请求没有随请求一起发送会话id。这将导致会话启动
生成一个新会话
可能导致浏览器在ajax请求期间不发送会话cookie的原因是域名不一致
不要在ini文件上设置session.cookie\u域,而是在运行时按如下方式进行设置
session_set_cookie_params(33600, '/', 'localhost.api.mydomain', FALSE, TRUE);
session_start();
要帮助您调试,请转到chrome中开发者工具上的网络选项卡。重新加载页面并检查请求标头和响应标头。检查jquery向其发送请求的主机。它可能只向本地主机发送请求。您可能已将站点配置为同时接受localhost和localhost.api.mydomain
要进行更多检查,请在文件中执行以下操作
session_set_cookie_params(33600, '/', 'localhost.api.mydomain', FALSE, TRUE);
session_start();
die($_SERVER['HTTP_HOST']);
这将让您在ajax请求期间比较jquery使用的请求url。这是一个
访问控制问题,而不是ajax
问题
当您直接从浏览器访问url时,您正在从正在访问的域请求(会话)cookie。在本例中,当您使用ajax
时,您正在从一个不是您正在访问的域请求cookie
在您位于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就会按预期运行。如果HTTP POST请求中提供了会话Cookie,请在“网络”选项卡上检查浏览器的调试工具。如果您的请求是跨域的,您的浏览器安全功能可能会删除Cookie。是否有办法对此进行编程?它是针对API的,因此期望每个用户都更改其浏览器设置并不理想。我尝试过以您描述的方式放置session\u set\u cookie\u params()
,包括上面和下面的session\u start()
,但都没有解决会话重置问题。还有其他想法吗?谢谢。网络控制台中请求的主机是localhost.api.mydomain
,php中HTTP\u host
的输出是localhost.api.mydomain
。感谢您的帮助,我真的希望这能解决问题,但是您还有其他调试建议吗?我非常感谢您提供的调试帮助。这发生在Windows 10开发机器和Ubuntu 16.04生产机器上。好的,我们可以通过聊天来完成吗?我需要查看chrome开发工具的网络部分。我很乐意尽我所能提供帮助。我可以复制这个问题,就像我使用同样的ubuntu 16.04一样。和windows 8.1
$.ajax({
url: 'https://api.example.com',
xhrFields: { withCredentials: true },
success: function(data) {
console.log(data)
}
});