Laravel 为每个请求创建一个新会话

Posted

技术标签:

【中文标题】Laravel 为每个请求创建一个新会话【英文标题】:Laravel creates a new session on every request 【发布时间】:2016-08-07 22:53:26 【问题描述】:

由于某种原因,我无法确定我的 Laravel 安装已开始为每个请求创建一个新的会话文件!这会使会话无用,因此我的用户无法保持登录状态,csrf 令牌不匹配等。

我正在使用 Laravel 5.2。在我的本地环境中似乎很好,但在实时服务器上却不行

有没有人知道为什么会发生这种情况以及我该如何解决?

提前致谢

【问题讨论】:

你在运行一些缓存服务器吗? Varnish、nginx代理缓存等? 你使用的是Laravel 5默认的认证方式吗? php 5.2 太旧了。考虑至少升级到 PHP >= 5.5.9(正如 Laravel 的要求中所说:laravel.com/docs/5.2/installation#server-requirements) 对不起,我指的是 Laravel 5.2!我的错误 【参考方案1】:

在本地一切正常,但在生产服务器上却不行。问题出在主机上的 php.ini 设置中,默认情况下,参数(变量)“mbstring.func_overload = 2”设置在那里。我删除了它,然后一切都奏效了。此参数适用于许多 CMS 使用的以前版本 (PHP)。并且Laravel在授权时报错419仅此而已,每次页面更新时都会创建一个新会话。

【讨论】:

你拯救了我的一天。你是怎么找到的?【参考方案2】:

从 5.1 升级到 laravel 5.4 后,我遇到了类似的问题, 发现我没有正确升级app/Http/Kernel.php。

\Illuminate\Session\Middleware\StartSession::class

protected $middleware 数组中被声明了两次 并在

protected $middlewareGroups

$middleware 数组中删除后 它开始正常工作

$middleware 应用于所有路由 和$middlewareGroups 应用于特定群体

【讨论】:

【参考方案3】:

检查this issue - Laravel 5.2.27 中有一个更改会自动为您注册 Web 中间件,因此如果您在路由中手动使用它(在 5.2 中必须这样做),那么它会中断。

【讨论】:

【参考方案4】:

这似乎是 PHP + MacOS 的怪癖。在我们的索引文件中,<?php 之前是一个空行。调试时间浪费的绝对荒谬的问题。

【讨论】:

【参考方案5】:

你检查过这个帖子laravel forum

它说检查文件中<?php 标记之前是否有空行 app/config/app.php ,如果有的话删除空行

【讨论】:

【参考方案6】:

我刚遇到这个问题,是使用dump()引起的。

这会将输出发送到浏览器(就像 php 标记之前的空格一样)并导致我的会话中断。

【讨论】:

【参考方案7】:

我的问题是我在生产站点的子域上进行本地测试。

我的本​​地 Laravel 位于 dev.example.com(映射到 localhost),prod 位于 example.com。 Prod cookie 干扰了开发站点。

解决方案:清除干扰 cookie 或将开发站点从子域移开。

【讨论】:

【参考方案8】:

正如其他人所提到的,这种情况经常发生在会话无法启动时,因为标头已经发送到浏览器(session_start 函数需要发送多个 HTTP 标头)。

这可能是由于任何文件中打开 <?php 标记之前的空格或换行符造成的。

不用寻找罪魁祸首,这可以通过启用 PHP 的output buffering 轻松解决。 在 php.ini 中查找 output_buffering 指令并将其更改为

output_buffering=4096

无论如何这是生产服务器的推荐值,它可能已经在 OP 的本地环境中定义,因此会话可以按预期在那里工作。

【讨论】:

为老问题添加新的解决方案没什么好遗憾的。

以上是关于Laravel 为每个请求创建一个新会话的主要内容,如果未能解决你的问题,请参考以下文章

React Fetch 到 Laravel API 创建新会话

Express.js/Passport 应用程序为每个请求创建新会话,尽管请求标头中有会话 ID

移动浏览器会针对每个请求启动新会话

如何防止 Jetty/GAE 为不同的上下文路径创建新会话?

使用_IECreate()创建新会话

org.openqa.selenium.SessionNotCreatedException:无法创建新会话。 (原始错误:请求了一个新会话,但一个正在进行中)