每次请求都会重置PHP会话

hmtdttj4  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(134)

它已经几天了,因为我试图得到这个工作。我有PHP会话的问题。服务器为nginx。我有三个子目录(子域):

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

在**app.dev/中有一个template/文件夹,其中包含PHP文件,如表单,头和网站的部分内容,这些文件由会话数据填充。通过jQuery.load()函数将其加载到index.html页面。
backend.app.dev/**上有一个page.php文件,该文件处理数据,并发送给API。
然后,当我在登录动作上发送 AJAX 请求时,在我从API获得令牌后,我需要将其存储到page.php上的会话中。在那个请求中,它成功地存储了它,但是,当我发送第二个请求时,检查会话中是否有令牌,它说会话是空的。我试着打印整个$_SESSION变量,它是空的。$_COOKIE。所以每次请求后会话都会被丢弃。我谷歌了很多。我尝试了很多解决方案(我会把我尝试过的解决方案的日志贴出来),我发现在/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
bxgwgixi

bxgwgixi1#

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

iyzzxitl

iyzzxitl2#

我终于解决了这个问题,经过这么长时间...我将API保存在一个单独的域中,但将前端和后端安装在同一个域中,但在不同的子文件夹中。所以现在我有:

  • api.app.dev
  • app.dev(前端)
  • app.dev/backend

和(本地)会话现在像魅力一样工作。我也有麻烦与服务这两个子目录,所以我打开了一个新的线程。下面是我使用的nginx设置:
为同一域上的多个站点提供服务
谢谢大家!

相关问题