"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
查看此代码示例如何正确处理它:
确保您的网络服务器上的系统时间正确。就我而言,流浪机器是在未来(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_DOMAIN
、xxx.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/*
登录以连接到服务器。
搜索错误
发生错误:搜索错误您没有豌豆。
搜索请求变长了。
我的注册页面正确显示了表格中的 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
查看此代码示例如何正确处理它:
确保您的网络服务器上的系统时间正确。就我而言,流浪机器是在未来(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_DOMAIN
、xxx.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
.
在表格中添加@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/*
登录以连接到服务器。
搜索错误
发生错误:搜索错误您没有豌豆。
搜索请求变长了。