Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax重置PHP会话_Php_Ajax_Session_Session Variables_Session Cookies - Fatal编程技术网

Ajax重置PHP会话

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页面,输出一个会话id进行调试。像这样:

<?php
session_start();
echo session_id();
?>
如果我手动访问url
http://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)
    }
  });