"The page has expired due to inactivity" - Laravel 5.5

"The page has expired due to inactivity" - Laravel 5.5

我的注册页面正确显示了表格中的 CsrfToken ({{ csrf_field() }})。

表格HTML

<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
        {{ csrf_field() }}
        ....
</form>

我正在为用户使用内置身份验证。除了路由和重定向之外没有改变任何东西。

当我提交表单时(也在重新加载之后),它显示 页面因不活动而已过期。请刷新并重试。 错误。

天哪,我遗漏了一件非常小的事情。但不确定它是什么。有帮助吗?

更新

发现问题。会话驱动程序设置为数组。将其更改为文件,错误现在消失了。 但是如果我使用数组有什么问题?

一些信息存储在cookie中,这些信息与开发中的laravel以前版本有关。所以它与 csrf 生成的令牌冲突,这些令牌是由另一个版本生成的。只需清除 cookie 并尝试一下。

尝试所有这些。

composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

如果您直接通过搜索 获得此答案,请确保您已经像 OP 一样使用 {{ csrf_field() }} 将 csrf 令牌添加到您的表单中。


如果您将会话驱动程序设置为文件:

可能与 storage_path 不可写有关。如果您使用的是基于文件的会话,这就是它存储有关令牌的会话数据的地方。可以用 is_writable(config('session.files'))

验证

对于 OP,会话驱动程序设置为数组。数组仅用于测试。由于数据未持久化,因此无法在下一次请求时比较令牌。

The array driver is used during testing and prevents the data stored in the session from being persisted.

https://laravel.com/docs/5.5/session#configuration


勾选config/session.php

最后,我刚刚遇到的一个问题是,我们有一个项目在 config/session.php 中具有会话域和安全设置,但开发站点未使用 HTTPS(SSL/TLS).这导致了这个一般性错误,因为 sessions.secure 默认设置为 true。

我 运行 在 Laravel 5.5 中遇到了同样的问题。在我的例子中,它发生在将路由从 GET 更改为 POST 之后。问题是因为我在切换到 POST 时忘记传递 CSRF 令牌。

您可以通过调用以下方式在您的表单中 post 一个 CSRF 令牌:

 {{ csrf_field() }}

或在 app/Http/Middleware/VerifyCsrfToken 中排除您的路线。php

 protected $except = [
        'your/route'
    ];

这是因为 Illuminate\Session\TokenMismatchException 查看此代码示例如何正确处理它:

https://gist.github.com/jrmadsen67/bd0f9ad0ef1ed6bb594e

确保您的网络服务器上的系统时间正确。就我而言,流浪机器是在未来(1 月 26 日 14:08:26 UTC 2226),所以我浏览器的会话 cookie 中的时间当然在大约 200 多年前就已经过期了。

我的应用程序有多个子域,会话 cookie 是它们之间的问题。清除 cookie 解决了我的问题。

此外,尝试在 .env 文件中设置 SESSION_DOMAIN。使用您正在浏览的确切子域。

就我而言,该网站在服务器上没有问题,但在本地却不行。然后我记得我在做安全网站。
所以在文件 config.session.php 中,将变量 secure 设置为 false

'secure' => env('SESSION_SECURE_COOKIE', false),

我更改了存储权限,错误消失了。问题似乎是未获得许可。

sudo chmod -R 775 storage/

对于那些仍然有问题但没有任何帮助的人。注意 php.ini mbstring.func_overload 参数。它必须设置为 0。并且 mbstring.internal_encoding 设置为 UTF-8。就我而言,这是个问题。

我的案例已通过 SESSION_DOMAIN 解决,在我的本地计算机中必须设置为 xxx.localhost。它导致与直接在 session.php 配置文件中设置的生产 SESSION_DOMAINxxx.com 发生冲突。

设置mbstring.func_overload=2

它帮助了我

我想出了两个解决方案来避免这些错误 1)通过添加 protected $except = ['/yourroute'] 可能禁用来自定义根的 csrf 令牌检查。 2)只需在内核中的受保护中间件组中注释 \App\Http\Middleware\VerifyCsrfToken::class 行

我遇到了同样的问题,但问题不在框架中,而是在浏览器中。我不知道为什么 google chrome 会自动阻止 cookie,就我而言。允许 cookie 后问题就解决了。

简答

app/Http/Middleware/VerifyCsrfToken.php

中添加register的路由条目
protected $except = [
        '/routeTo/register'
    ];

并使用以下命令清除缓存和缓存路由:

php artisan cache:clear && php artisan route:clear

详情

每次访问 Laravel 站点时,都会生成一个令牌,即使会话尚未启动也是如此。然后,在每个请求中,该令牌(存储在 cookie 中)将根据其到期时间进行验证,该时间在 config/session.php 文件的 SESSION_LIFETIME 字段中设置。

如果您保持站点打开的时间超过过期时间并尝试发出请求,将评估此令牌并出现过期错误 return。因此,要跳过经过身份验证的用户(例如注册或登录)功能之外的表单的验证,您可以在 app/Http/Middleware/VerifyCsrfToken.php.

中添加 except 路由

在表格中添加@csrf 并转到 VerifyCsrfToken.php

app->Http->中间件->VerifyCsrfToken.php

protected $except = [
        'paste your route here'
    ];

很多时候发生这种情况是因为您在过去的日期测试项目

解决方案:

使用隐身新标签,然后再次测试。

原因:

在我的例子中,另一个用户使用我的管理面板登录

我在 Linux-mint 上遇到了同样的问题,但后来意识到 htdocs 文件夹没有完全权限。所以我通过以下方式更改了 htdocs 文件夹中所有子目录的权限:sudo chown -c -R $USER:$USER /opt/lampp/htdocs/*

登录以连接到服务器。

搜索错误

发生错误:搜索错误您没有豌豆。

搜索请求变长了。