Laravel会话始终更改Laravel 5.4中的每个刷新/请求

Laravel会话始终更改Laravel 5.4中的每个刷新/请求,laravel,session,cookies,laravel-5,session-cookies,Laravel,Session,Cookies,Laravel 5,Session Cookies,所以这个标题基本上说明了一切,我使用的是Laravel5.4,PHP7.1,在我的本地机器上,会话工作得很好。基本上,每次尝试登录或重新加载页面时,我都会得到一个新的CSRF令牌,这会破坏一切。我使用数据库作为会话驱动程序,它会在我发出的每个请求中创建一个新的DB条目。这发生在我第一次升级本地计算机时,但要解决它,解决方案是更新我的cookie\u domain env变量,我让它工作。然而,在我的新服务器上,我尝试了我能想到的每一个域,但它仍然不起作用 这是我所知道的 会话cookie没有保

所以这个标题基本上说明了一切,我使用的是Laravel5.4,PHP7.1,在我的本地机器上,会话工作得很好。基本上,每次尝试登录或重新加载页面时,我都会得到一个新的CSRF令牌,这会破坏一切。我使用数据库作为会话驱动程序,它会在我发出的每个请求中创建一个新的DB条目。这发生在我第一次升级本地计算机时,但要解决它,解决方案是更新我的cookie\u domain env变量,我让它工作。然而,在我的新服务器上,我尝试了我能想到的每一个域,但它仍然不起作用

这是我所知道的

  • 会话cookie没有保存在Chrome->Application->Cookies下,这确实显示在我的本地设置中

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

  • 本地服务器和我的新服务器都运行完全相同的git分支,并且都运行Apache2.4、Laravel5.4和PHP7.1,因此我假设这是某种配置问题。本地和服务器都在运行centos 7

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

我想这是某个地方的配置问题,但我不知道,任何帮助都将不胜感激。如果有帮助,请在我的响应标题下查找我的初始页面加载,sid和laravel会话都存在于“Set Cookie”命令下,但都没有实际保存到本地应用程序Cookie存储中

编辑/更新 因此,最初我回答我自己的问题时说,我认为这是一个修复,但是这个修复已经不起作用了,我的问题到处都是。因此,更新我的问题和以前一样,尝试做任何事情都会创建一个新的会话,重新加载和导航几个页面会由于ajax请求和其他su而增加几十个会话ch活性

我现在的设置是这样的,我有3台服务器,这三台服务器都运行在一个克隆映像上,这意味着它们是相同的,但是其中一台是子域development.mysite.com,另外两台是主站点mysite.com的负载平衡。因此,我能想到的唯一可能的解释是,不知何故,laravel无法理解我的设置,因为o我的子域。我在.env文件(development.mysite.com、.mysite.com、mysite.com、.development.mysite.com等)中尝试了COOKIE_域的所有可能组合,并在主机上添加了几十个选项,但都没有效果。对此有何想法

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

我发现解决这个问题的方法有两个部分,不确定为什么会有所不同,因为它是相同的操作系统和设置

步骤1确保正确设置了COOKIE_域,并且没有端口号(在.env中或直接在/config/session.php中,以您使用的为准)


第2步确保/config/sessions.php中的cookie名称('cookie'=>'whatever')中没有下划线。Laravel显然对此有问题。

我们也遇到了此错误,这似乎是解决问题的方法:

•检查您的
存储/
文件夹是否具有正确的权限

•尝试禁用页面中的所有Javascript(通过导航器或代码内部禁用),并确保
'http\u only'=>true,

•尝试使用https和不使用https

•确保会话驱动程序变量不为空

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

•尝试更改cookie名称
“cookie”=>“laravelsession”,

•尝试将会话域设置为实际域或空

•尝试在'secure'=>env('SESSION\u secure\u COOKIE',false)和'secure'=>env('SESSION\u secure\u COOKIE',true)之间切换

在每一步之后,这个bug似乎都被修复了,但不知何故,cookie仍然没有在导航器中设置,直到我们在开发中也使用https


很抱歉,我无法提供100%的修复,但有完全相同的问题,我想与您分享我的经验。

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

使用文件作为会话存储,这可能是一个权限问题,[如果您在centos上,请检查SELINUX],laravel(这意味着apache或nginx或您的进程运行时使用的任何用户)应该对存储会话文件的文件夹[通常是项目根目录/存储文件夹]具有读写权限

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

这再次意味着laravel无法存储会话数据。 在这里查看我的详细答案


最后一点是关于上面提到的cookie和域设置。希望这有助于为将来解决此问题的任何人指出问题。

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

我在Laravel 5.6中也遇到了类似的问题。我的应用程序正在运行,并且从来没有关于身份验证的问题。突然我收到一个
“419 |页面过期”
错误,每次刷新都会生成CSRF令牌

最后,我发现浏览器已经阻止了应用程序设置的cookies。我仍然没有找到一个永久的修复方法,但是允许或删除那些被阻止的cookies暂时解决了这个问题

我的