每次请求都会重置PHP会话

时间:2017-09-28 16:17:05

标签: php ajax session nginx

自从我尝试这项工作以来已经过了几天。我有PHP会话的问题。服务器是 nginx 。我有三个子目录(子域):

  • app.dev / (有前端,客户访问)
  • backend.app.dev / (处理AJAX请求并与API通信的php页面)
  • api.app.dev / (API)

app.dev / 中,有template/文件夹,其中包含PHP文件,例如表单,标题和站点部分,这些文件将根据会话数据填充。这是通过index.html功能加载到jQuery.load()页面的。

backend.app.dev / 上有page.php个文件处理数据,并发送给API。

然后,当我在登录操作上发送AJAX请求时,以及从API获取令牌后,我需要将其存储到page.php上的会话中。在该请求中,它成功存储它,但是,当我发送第二个请求时,哪个检查在会话中有一个令牌,它表示该会话为空。我尝试打印整个$_SESSION变量,它是空的。 $_COOKIE也是。因此会话在每次请求后都会被删除。我google了很多。我尝试了很多解决方案(我将发布我尝试过的解决方案的日志。)我发现在/var/lib/php/sessions中的每个请求之后都创建了文件。

我尝试在每个请求上打印会话ID,它总是不同......

从日志文件中,几次发送相同的请求:

[28.Sep.2017 04:39:12]: session id: c0556q1s47kger3l53tgrdadhu

[28.Sep.2017 04:39:29]: session id: 83nmqq1l9d27v7jhh7748gq2ru

[28.Sep.2017 04:39:33]: session id: ece5as0eb0egoolun8u9s0duqi

我记录了一个日志:

//session_name("backend");
//session_set_cookie_params(0, '/', '.dev');
//session_start();

//session_name('backend');
//ini_set('session.cookie_domain', 'hr.dev');
//ini_set('session.save_path', '/var/lib/php/session');
//ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
//session_start();

//session_name("all");
//$sess_life_time = 21600; //in seconds
//$sess_path = "/";
//$sess_domain = ".dev";
//$sess_secure = true; // if you have secured session
//$sess_httponly = true; // httponly flag

//ini_set('suhosin.session.cryptdocroot', 'off');
//ini_set('suhosin.cookie.cryptdocroot', 'off');

//session_set_cookie_params($sess_life_time, $sess_path, $sess_domain, $sess_secure, $sess_httponly);

//session_name("all");
//ini_set("session.cokie_domain",".dev");
//session_set_cookie_params(0, '/', '.dev');
//session_start();

//  session_name("mysession");
//  session_set_cookie_params(0,"/",".dev",FALSE,FALSE);
//  setcookie(session_name(), session_id(),0,"/",".dev");
//  session_start();

可能是什么问题?服务器上缺少什么东西吗?

如果我们尽快解决这个问题,我真的非常感谢。

修改

我在backend.app.dev /

设置会话变量(启动会话)

编辑2:

php.ini信息:

session.auto_start => Off => Off
session.cache_expire => 180 => 180
session.cache_limiter => nocache => nocache
session.cookie_domain => no value => no value
session.cookie_httponly => Off => Off
session.cookie_lifetime => 0 => 0
session.cookie_path => / => /
session.cookie_secure => Off => Off
session.gc_divisor => 1000 => 1000
session.gc_maxlifetime => 1440 => 1440
session.gc_probability => 0 => 0
session.lazy_write => On => On
session.name => PHPSESSID => PHPSESSID
session.referer_check => no value => no value
session.save_handler => files => files
session.save_path => /var/lib/php/sessions => /var/lib/php/sessions
session.serialize_handler => php => php
session.sid_bits_per_character => 5 => 5
session.sid_length => 26 => 26
session.upload_progress.cleanup => On => On
session.upload_progress.enabled => On => On
session.upload_progress.freq => 1% => 1%
session.upload_progress.min_freq => 1 => 1
session.upload_progress.name => PHP_SESSION_UPLOAD_PROGRESS => PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix => upload_progress_ => upload_progress_
session.use_cookies => On => On
session.use_only_cookies => On => On
session.use_strict_mode => Off => Off
session.use_trans_sid => 0 => 0

2 个答案:

答案 0 :(得分:1)

PHP正在为您所在的域(或子域)设置会话。

您可以在php.ini中设置

session.cookie_domain = "domain.com"

session.cookie_domain = ".domain.com"

其他选项是为整个域设置cookie,例如。 domain.com具有会话令牌,并从脚本管理整个会话。可能有用的图书馆:

https://github.com/auraphp/Aura.Session

https://github.com/stefangabos/Zebra_Session

答案 1 :(得分:0)

经过这么多时间,我终于解决了这个问题。我将API保留在分离的域中,但是将前端和后端集成在同一个域中但位于不同的子文件夹中。所以现在我有:

  • api.app.dev

  • app.dev (前端)

  • app.dev/backend

和(本土)会话现在像魅力一样工作。我也有服务这两个子目录的麻烦,所以我打开了新的主题。我使用了nginx个设置:

Serving multiple sites on the same domain

谢谢大家!