Codeigniter Session сбрасывается при обновлении - PullRequest
0 голосов
/ 28 августа 2018

После месяца, пытаясь решить эту проблему и пытаясь найти ответы на различные вопросы, я решил задать это сам.

Эта проблема возникает на новом сервере, который мы недавно купили, тот же код, который отлично работает на локальном хосте и последнем сервере. Но, вероятно, это связано с кодом.

Сессия создана правильно и токен установлен, var_dump показывает это. Но когда пользователь пытается войти в систему, после перенаправления на функцию доступа токен сеанса не устанавливается, поэтому вход в систему не происходит.

Даже на той же странице, если вы обновляете, __ci_last_regenerate (который получает время, когда Сессия была восстановлена ​​в последний раз) является текущим временем и изменяется после каждого отдельного обновления.

В var / lib / php / session после каждого обновления создаются два разных файла, не знаю почему. Вот картинка:

enter image description here

Данные за 19 секунд содержат правильные данные (время и токен), последним - только время.

Кроме того, мы недавно добавили новый поддомен на сайт, поэтому на одном сервере у нас есть два разных поддоменов.

Это конфигурация сеанса:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

Пробовал также с драйвером БД, и он генерировал 2 (или 3 строки иногда) таблицы. Конфиг был:

$config['sess_driver']= 'database';
$config['sess_cookie_name']= 'ci_session';
$config['sess_expiration']= 0;
$config['sess_save_path']= 'ci_sessions';
$config['sess_match_ip']= FALSE;
$config['sess_time_to_update']= 300;
$config['sess_regenerate_destroy']= FALSE;
$config['sess_use_database']= TRUE;
$config['sess_expire_on_close']= TRUE;
$config['sess_table_name']= 'ci_sessions';

И вывод базы данных в виде ее столбцов (id, ip, timestamp, data):

enter image description here

Данные всегда одинаковы: последний регенерат, содержащий время и токен в одном случае, и только последний регенерат в другом (2 строки на каждое обновление).

PHP - 7.2.7. CodeIgniter составляет 3.1.5.

Любой дополнительный необходимый код или информация о сервере будут предоставлены по запросу.

Редактировать 4/9: Также добавляем эти данные cookie, как это просят некоторые пользователи.

$config['cookie_domain']    = '.my-domain.com';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

Хорошо, проблема была в Apache conf в нашем Centos 7 с двумя поддоменами.

У нас были данные VirtualHost в одном и том же файле httpd conf. Исправление состояло в том, чтобы создать разные файлы конфигурации для каждого домена. Что-то вроде:

domain1.com.conf

<VirtualHost *:80>
  ServerName domain1.com
  ServerAlias domain1
  DocumentRoot /var/www/html/domain1
  ErrorLog /var/log/httpd/domain1-error_log
  CustomLog /var/log/httpd/domain1-access_log combined
</VirtualHost>

И то же самое для домена 2.

Надеюсь, это может кому-нибудь помочь.

0 голосов
/ 02 сентября 2018

- убедитесь, что вы инициализировали библиотеку сессий только один раз

$this->load->library('session');

- убедитесь, что он не загружен

application/config/autoload.php

- вызовите session_write_close(), если вам больше не нужно ничего делать с переменными сеанса, если вы используете codeigniter версии 3

- убедитесь, что вы не unset( $_SESSION ); и не уничтожили его

session_destroy();

// or

$this->session->sess_destroy();

-сессии затрагиваются этими конфигурациями куки application/config/config.php

$config['cookie_domain']    = '.your-domain.com';
$config['cookie_path']      = '/';
0 голосов
/ 04 сентября 2018

, если вы используете http-сервер, поэтому установите config_secure = false, иначе ваш сеанс будет прекращаться при каждом обновлении страницы

отметьте ниже

   $config['cookie_prefix'] = '';
   $config['cookie_domain'] = '';
   $config['cookie_path'] = '/';
   $config['cookie_secure'] = FALSE;
   $config['cookie_httponly']   = FALSE;
0 голосов
/ 28 августа 2018

Похоже, что вы не храните данные сеанса нигде, кроме файла cookie пользователя, так как кажется, что ваша конфигурация читает

$config['sess_save_path'] = NULL;

Поскольку вы используете драйвер files, вы должны указать местоположение для данных сеанса, которые будут храниться на сервере. По умолчанию (из коробки) CodeIgniter настроен так:

$config['sess_save_path'] = APPPATH . 'ci_session/';

вам нужно указать каталог, в который CodeIgniter может писать. В противном случае, если данные сеанса не сохраняются на сервере, всякий раз, когда вы пытаетесь что-либо сделать, сеанс в файле cookie не будет сопоставляться ни с чем.

Помните, что сеансы CI - это не то же самое, что сеансы PHP.

Кроме того, поскольку сам CI утверждает в конфигурации:

|   'sess_save_path'
|
|   The location to save sessions to, driver dependent.
|
|   For the 'files' driver, it's a path to a writable directory.
|   WARNING: Only absolute paths are supported!
|
|   For the 'database' driver, it's a table name.
|   Please read up the manual for the format with other session drivers.
|
|   IMPORTANT: You are REQUIRED to set a valid save path!

ОБНОВЛЕНИЕ (31 августа 2018 г.) На основе обновлений, которые вы внесли в исходный вопрос:

В конфигурации сеанса есть несколько ненужных / избыточных настроек при использовании базы данных. Это все, что вам нужно, все, что нужно для настройки, должно исчезнуть:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 0;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

Я не думаю, что это так, но, пожалуйста, проверьте ваш код для любого места, где вы можете вызывать встроенную функцию session_start(). Это приводит к тому, что управление сеансами CI ведет себя непредсказуемо, и один из симптомов состоит в том, что сеансы не сохраняются (я усвоил этот трудный путь, потратил около месяца на отладку, пока не обнаружил единственный вызов session_start, который все испортил)

Не могли бы вы проверить, действительно ли пишется столбец data в таблице сеансов? (еще один симптом вышеупомянутого). Попробуйте запустить это, и если все возвращается как «пустое», мы можем приблизиться:

select
case
when cast(data as char(1000)) = '' then "empty"
else "something"
end as content, count(*)
from ci_sessions group by content;

Кроме того, имейте в виду, что создания таблицы сессий на самом деле недостаточно. Вы запускали ALTER, что требуется в зависимости от настроек sess_match_ip?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...