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 为不同的上下文路径创建新会话?
org.openqa.selenium.SessionNotCreatedException:无法创建新会话。 (原始错误:请求了一个新会话,但一个正在进行中)