为什么PHP不读取通过cookie发送的会话ID?

为什么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_会话值

我正在将一个应用程序从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_会话
值(如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