它已经几天了,因为我试图得到这个工作。我有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
2条答案
按热度按时间bxgwgixi1#
PHP正在为您所在的域(或子域)设置会话。
您可以在php.ini中设置
或
另一个选择是设置cookie为整个域例如.domain.com,并通过脚本管理整个会话。可以使用的库:
https://github.com/auraphp/Aura.Session
https://github.com/stefangabos/Zebra_Session
iyzzxitl2#
我终于解决了这个问题,经过这么长时间...我将API保存在一个单独的域中,但将前端和后端安装在同一个域中,但在不同的子文件夹中。所以现在我有:
api.app.dev
app.dev
(前端)app.dev/backend
和(本地)会话现在像魅力一样工作。我也有麻烦与服务这两个子目录,所以我打开了一个新的线程。下面是我使用的
nginx
设置:为同一域上的多个站点提供服务
谢谢大家!