it-roy-ru.com

Laravel Session всегда меняет каждое обновление/запрос в Laravel 5.4

Так что название в основном говорит само за себя, я использую Laravel 5.4, PHP 7.1 и на моей локальной машине сессии работают просто отлично. По сути, при попытке войти в систему или перезагрузить страницу каждый раз, когда я получаю новый токен CSRF, который ломает все. Я использую базу данных в качестве драйвера сеанса, и она создает новую запись в БД каждый мой запрос. Это произошло на моем локальном компьютере, когда я впервые обновил, но чтобы исправить это, решение было обновить мою переменную cookie_domain env, и я заработал. Однако на моем новом сервере я перепробовал все домены, которые мог придумать, и он все еще не работает. 

Вот что я знаю,

  • Файл cookie сеанса не сохраняется в Chrome -> Приложение -> Файлы cookie, он действительно отображается в моей локальной настройке.

  • CSRF-TOKEN получает новое значение при каждой перезагрузке страницы, но файл cookie XSRF-TOKEN присутствует и сохраняет свое значение при каждой перезагрузке.

  • И на локальном, и на моем новом сервере запущена одна и та же ветка git, и оба работают под управлением Apache 2.4, Laravel 5.4 и PHP 7.1, так что я могу предположить, что это какая-то проблема конфигурации. И локальный, и серверный работают под управлением Centos 7

  • Каждый запрос создает новый сеанс в БД, это происходит для запросов get, post и ajax. 

Я предполагаю, что это проблема конфигурации откуда-то, но я понятия не имею, любая помощь будет принята с благодарностью. Если это помогает, то, глядя под моим ответом Заголовки для моей начальной загрузки страницы, и sid, и сеанс laravel присутствуют в команде «Set-Cookie», но ни один из них фактически не сохраняется в локальном хранилище файлов cookie приложения. 

Редактировать/Обновить Итак, изначально я ответил на свой вопрос, сказав, что, по моему мнению, это было исправление, однако это исправление больше не работает, и я вижу эту проблему повсюду. Таким образом, чтобы обновить мою проблему так же, как и раньше, попытка сделать что-либо создает новый сеанс, перезагрузка и навигация по нескольким страницам добавляет десятки сеансов из-за запросов ajax и других подобных действий.

Моя настройка теперь такова: у меня 3 сервера, на всех трех из которых работает клонированный образ, что означает, что они идентичны, однако один из них является поддоменом, development.mysite.com, а другие 2 сбалансированы по нагрузке для основного сайта mysite. .com. Таким образом, ЕДИНСТВЕННОЕ возможное объяснение, которое я могу придумать, заключается в том, что Laravel не может понять мои настройки из-за моего поддоменов. Я перепробовал каждую возможную комбинацию COOKIE_DOMAIN в файле .env (development.mysite.com, .mysite.com, mysite.com, .development.mysite.com и т.д.), И я добавил десятки вариантов для своего хоста. помогло. Любые идеи относительно того, что это может быть? 

** Редактирование/обновление № 2 ** В дополнение к этому я обнаружил, что это может быть связано с тем, что мой используемый домен является поддоменом, в котором основной домен также работает с laravel, если это так, мне придется выяснить как и почему. 

13
CMOS

Я нашел решение для этого было 2 части, не уверен, почему это изменилось, так как это была та же ОС и настройки.

Шаг 1 убедитесь, что COOKIE_DOMAIN установлен правильно и без номеров портов (либо в .env, либо непосредственно в /config/session.php, в зависимости от того, что вы используете) 

Шаг 2 убедитесь, что имя файла cookie ('cookie' => 'what') внутри /config/sessions.php НЕ содержит подчеркивания. У Laravel, очевидно, были проблемы с этим. 

4
CMOS

Мы получили эту ошибку тоже, и это то, что, кажется, решить проблему: 

• Убедитесь, что ваша папка storage/ имеет правильное право

• Попробуйте отключить весь Javascript на своих страницах (отключив его с помощью навигатора или внутри кода) и убедитесь, что 'http_only' => true,

• Попробуйте использовать с и без https 

• Убедитесь, что переменная SESSION_DRIVER НЕ является нулевой

• Попробуйте переключиться между 'encrypt' => false, и 'encrypt' => true,

• Попробуйте изменить имя файла cookie 'cookie' => 'laravelsession',

• Попробуйте либо установить свой SESSION_DOMAIN в свой фактический домен OR, ноль

• Попробуйте переключиться между «secure» => env («SESSION_SECURE_COOKIE», false) и «secure» => env («SESSION_SECURE_COOKIE», true),

После каждого шага эта ошибка кажется исправленной, но каким-то образом cookie все еще не устанавливается в навигаторе до тех пор, пока мы не будем использовать https при разработке.

Я сожалею, что не могу предоставить 100% исправление, но, имея ТОЧНУЮ проблему, я хотел бы поделиться с вами своим опытом.

5
Mathieu Ferre

Основной причиной этой проблемы является неспособность laravel сохранить данные сеанса на стороне сервера.

С файлом в качестве хранилища сеансов это может быть и, как правило, проблема с разрешениями, [проверьте SELINUX, если вы находитесь в centos], laravel (это означает, что Apache или nginx или любой другой пользователь, с которым работает ваш процесс) должен иметь разрешение на чтение и запись в папке где хранятся файлы сессии [Обычно это корневая папка проекта/папка хранения].

Другая причина, по которой это может произойти, - это когда вы используете базу данных в качестве хранилища сеансов и создали таблицу сеансов вручную и допустили ошибку при создании столбца id типа bigint (20) или любого другого столбца с несоответствием.

Это снова означает, что laravel не может сохранить данные сеанса . Проверьте мой подробный ответ об этом здесь https://stackoverflow.com/a/45340647/7260022

И последний момент касается настройки файлов cookie и доменов, как указано выше. Надеюсь, что это поможет точно определить проблему для любого, кто борется с проблемой в будущем. 

1
Waku-2