为什么PHP不读取通过cookie发送的会话ID?
我正在将一个应用程序从CodeIgniter 2.2.1升级到3.1.8。应用程序对用户进行身份验证,并将身份验证状态保存在会话中,升级后的会话已中断,用户无法再登录。我正在Linux虚拟机上通过nginx上的PHP-FPM运行PHP 7.1.12版 我花了1.5天的大部分时间试图弄清这件事的真相。据我所知,这可以归结为PHP没有读取浏览器通过cookie发送的会话ID,而是为每个请求创建一个新会话(和会话ID)。我可以从请求cookie中的为什么PHP不读取通过cookie发送的会话ID?,php,codeigniter,session,cookies,Php,Codeigniter,Session,Cookies,我正在将一个应用程序从CodeIgniter 2.2.1升级到3.1.8。应用程序对用户进行身份验证,并将身份验证状态保存在会话中,升级后的会话已中断,用户无法再登录。我正在Linux虚拟机上通过nginx上的PHP-FPM运行PHP 7.1.12版 我花了1.5天的大部分时间试图弄清这件事的真相。据我所知,这可以归结为PHP没有读取浏览器通过cookie发送的会话ID,而是为每个请求创建一个新会话(和会话ID)。我可以从请求cookie中的ci_会话值不同于相应响应cookie中的ci_会话值
ci_会话
值不同于相应响应cookie中的ci_会话
值(如Firefox devtools中显示的)这一事实以及每次都创建一个新文件的事实中看出这一点。(我已将CodeIgniter配置为使用文件驱动程序。)
在尝试调试时,如果在调用session\u start()。紧接着,我看到了Firefox在响应cookie中显示的相同的新会话ID
我已经相当广泛地阅读了:
- PHP会话文档
- Stackoverflow和其他Google结果
并尝试了以下补救措施,但无效:
- 将PHP
error\u reporting
设置为E\u ALL
,并检查PHP错误日志中是否存在任何消息,例如与已输出的标题相关的消息
- 将
$config['encryption\u key']
的值更改为从的CodeIgniter部分复制的随机32个字符字符串
- 将
$config['sess\u cookie\u name']
的值更改为仅由小写字母数字字符组成的字符串
- 确保会话文件确实是在
$config['sess\u save\u path']
目录中创建的,并且具有正确的ID和信息
- 已尝试将
$config['cookie\u domain']
设置为.domainname.tld
(也只是'
)
- 直接跳到CI 3.1.8(我最初升级到3.0.0,并计划对3.1.8之前的每个版本进行升级说明。我还没有这样做,而是用3.1.8版本替换了
/system
文件夹)
下面我粘贴了我认为是来自CI和PHP的所有相关设置。很明显,我遗漏了一些东西,很可能是一些非常基本的东西。如何进一步诊断/修复
编码点火器设置
$config['cookie_prefix'] = "";
$config['cookie_domain'] = "";
$config['cookie_path'] = "/";
$config['cookie_secure'] = FALSE;
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 3600 * 24 * 60; // 60 days
$config['sess_use_database'] = FALSE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_driver'] = 'files';
$config['sess_save_path'] = BASE . 'storage/session';
Session Support enabled
Registered save handlers files user
Registered serializer handlers php_serialize php php_binary wddx
Directive Local Value Master Value
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 1 1
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/opt/remi/php71/lib/php/session /var/opt/remi/php71/lib/php/session
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
PHP设置
$config['cookie_prefix'] = "";
$config['cookie_domain'] = "";
$config['cookie_path'] = "/";
$config['cookie_secure'] = FALSE;
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 3600 * 24 * 60; // 60 days
$config['sess_use_database'] = FALSE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_driver'] = 'files';
$config['sess_save_path'] = BASE . 'storage/session';
Session Support enabled
Registered save handlers files user
Registered serializer handlers php_serialize php php_binary wddx
Directive Local Value Master Value
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 1 1
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/opt/remi/php71/lib/php/session /var/opt/remi/php71/lib/php/session
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
您描述的问题通常是错误的$config
项目设置
你需要转到文档,一步一步地完成它。讨论更新会话使用需要做什么。在我看来,您正在使用v2.x会话$config
项。与会话相关的$config
有重要更改。先看看这些。其中一个主要问题是确保$config['base\u url']
设置正确。一个坏的值有各种各样的坏的副作用
您可能希望查看3.0.0和当前版本之间的每个“升级”文档,以查看是否有任何内容可能会影响您的站点。对于大多数版本,除了替换系统文件夹外,没有什么“步骤”。除了v3.0.0之外,我还记得没有影响会话的内容。但仍有一些重要事项需要注意
有关确定会话是否正常工作的帮助,请查看以下简单示例
有时,当使用'files'
驱动程序时,会出现此问题,这可能是权限问题。但正如您看到的,创建的文件不是这样。好的,我最终解决了这个问题。我不确定解决方案是什么,但我所做的最后一个修改是从浏览器中清除与站点相关的所有COOKIE,注意到$\u COOKIE
superglobal没有包含ci\u会话的条目(COOKIE的名称在$config['sess\u COOKIE\u name']
中配置),尽管它显示在Firefox开发工具中显示的浏览器请求中
一路上,我还:
- 从PHP7.1升级到PHP7.2
- 删除了两个CI 2.2时代不推荐的会话设置(特别是,
$config['sess\u use\u database']
和$config['sess\u table\u name']
)
- 在CI 3.1.8和可能的早期版本中添加了新设置(
$config['sess\u regenerate\u destroy']=FALSE;
)
顺便说一下,我还注意到,session\u id()。因此,我错误地将session\u id()
返回的空白字符串解释为PHP无法读取作为cookie一部分提交给它的值。我根本不知道Codeigniter,但实际上最好的做法是在用户登录时重新生成会话id,以防止会话固定。你是否试图在每次请求时重新验证用户身份?我有一个类似的方法,但当使用特定的Android手机和特定的浏览器时,它只能在一台服务器上复制。从未找到解决方案,并且花了数天时间。。。每次调用ajax时都会生成会话。由于无法复制,最终将其记录到手机上。我建议切换到db会话,看看这是否会解决问题(我认为基于cookie的会话有大小限制),这样就可以了,否则请更改cookie名称,看看这是否有帮助。谢谢!您的工具确认会话不起作用(我保持注销状态,所有更新都是\u ci\u last\u regenate