Laravel会话总是更改Laravel 5.4

时间:2017-03-13 17:04:26

标签: laravel session cookies laravel-5 session-cookies

所以标题基本上都说明了,我正在使用Laravel 5.4,PHP 7.1并且在我的本地机器会话上工作得很好。基本上每次我尝试登录或重新加载页面时,我都会获得一个新的CSRF令牌,从而破坏了所有内容。我使用数据库作为我的会话驱动程序,并且每创建一个请求就会在数据库中创建一个新条目。当我第一次升级时,这发生在我的本地机器上但修复它的解决方案是更新我的cookie_domain env变量,我得到了它的工作。然而,在我的新服务器上,我已经尝试了我能想到的每个域,但它仍然无效。

这就是我所知道的,

  • 会话Cookie未在Chrome下保存 - >申请 - > Cookies,这确实出现在我的本地设置上。

  • 每次重新加载页面时,CSRF-TOKEN都会获得一个新值,但XSRF-TOKEN cookie会出现并在每次重新加载时保持其值。

  • 本地和我的新服务器都运行完全相同的git分支,并且都运行apache 2.4,Laravel 5.4和PHP 7.1,所以这让我觉得它是某种配置问题。本地和服务器都运行centos 7

  • 每个请求都会在数据库中创建一个新会话,这会发生在get,post和ajax请求中。

我认为这是来自某个地方的配置问题,但我不知道,任何帮助将不胜感激。如果它有帮助,查看我的响应Header为我的初始页面加载sid和laravel会话都出现在'Set-Cookie'命令下,但实际上都没有保存到本地应用程序cookie存储。

修改/更新 所以最初我回答了我自己的问题,说出我认为是修复的问题,但是这个修复工具已经不再适用了,而且我在整个地方都遇到了这个问题。所以更新我的问题与以前一样,尝试做任何事情都会创建一个新会话,重新加载和导航几个页面会因为ajax请求和其他此类活动而增加几十个会话。

我现在的设置是这样的,我有3台服务器,这三台服务器都运行了一个克隆的图像,这意味着它们是相同的,但其中一个是子域,development.mysite.com,另外两个是负载均衡的主站点mysite.com。因此,我能提出的唯一可能的解释是,由于我的子域名,laravel无法理解我的设置。我已经在.env文件(development.mysite.com,.mysite.com,mysite.com,.development.mysite.com等)中尝试了COOKIE_DOMAIN的所有可能组合,并且我已经向我的主机添加了几十个选项无济于事。关于这可能是什么的任何想法?

**编辑/更新#2 ** 除此之外,我发现它可能与我的域使用是一个子域有关,其中主域也运行laravel,如果是这样,我将不得不弄清楚如何以及为什么。

6 个答案:

答案 0 :(得分:5)

我发现这个问题的解决方案有两个部分,不确定为什么它变化多了,因为它是相同的操作系统和设置。

步骤1确保COOKIE_DOMAIN设置正确且没有端口号(无论是在.env中还是直接在/config/session.php中,无论您使用哪个)

步骤2确保/config/sessions.php中的cookie名称('cookie'=>'whatever')中没有下划线。 Laravel显然遇到了这个问题。

答案 1 :(得分:5)

我们也抛出了这个错误,这似乎解决了这个问题:

•检查您的storage/文件夹是否正确

•尝试禁用网页中的所有Javascript(通过导航器或代码内部禁用它)并确保'http_only' => true,

•尝试使用和不使用https

•确保SESSION_DRIVER变量为非null

•尝试在'encrypt' => false,'encrypt' => true,

之间切换

•尝试更改Cookie名称'cookie' => 'laravelsession',

•尝试将SESSION_DOMAIN设置为您的实际域或空

•尝试切换' secure' => env(' SESSION_SECURE_COOKIE',false),' secure' => env(' SESSION_SECURE_COOKIE',true),

在每一步之后,这个错误似乎都得到了修复,但不知何故,在我们使用https进行开发之前,某些时候cookie仍未在导航器中设置。

我很抱歉不能提供100%的修复,但是如果有同样的问题,我想与您分享我的经验。

答案 2 :(得分:1)

此问题的主要原因是laravel无法在服务器端保存会话数据。

使用文件作为会话存储,它可以是&通常是权限问题,[如果你在centos上检查SELINUX],laravel(这意味着apache或nginx或你的进程运行的任何用户)应该对存储会话文件的文件夹具有读写权限[通常是项目root / storage folder]。

这种情况可能发生的另一个原因是当您使用数据库作为会话存储并手动创建会话表时,会犯错误:使用bigint(20)类型的id列或任何其他不匹配列。

这再次意味着laravel无法存储会话数据。 在https://stackoverflow.com/a/45340647/7260022

查看我的详细答案

最后一点是关于如上所述的cookie和域设置。希望有助于确定将来遇到问题的任何人的问题。

答案 3 :(得分:0)

禁用nginx缓存(如果使用)。对我来说,它解决了同样的问题。

答案 4 :(得分:0)

我也在Laravel 5.6中面临类似的问题。我的应用程序正在运行,并且从来没有关于身份验证的问题。突然我遇到了"419 | page is expired"错误,每次刷新都生成了CSRF令牌。

最后,我发现浏览器阻止了该应用程序设置的cookie。我仍然找不到永久性的修复程序,但是允许或删除这些被阻止的cookie可以暂时解决此问题。

我的config/sessions.php*配置文件中没有任何更改,该应用程序在本地服务器上运行正常。

答案 5 :(得分:-2)

两天后我发现了这个问题 您去Cpanel中选择PHP版本的那个 一次更改选项部分和所选版本,然后返回到之前的状态。这样,您可以将会话的内存重置为干净!然后就可以了。

对不起,我不太会英语