"由于不活动,该页面已过期" - Laravel 5.5

时间:2017-09-10 14:18:36

标签: php laravel csrf laravel-5.5

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

表单HTML

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

我正在为用户使用内置身份验证。除路线和重定向外,没有任何改变。

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

我是一个非常小的东西。但不确定它是什么。有什么帮助吗?

更新

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

21 个答案:

答案 0 :(得分:139)

如果您直接通过搜索来回答此问题,请确保已将csrf令牌添加到表单中{{ csrf_field() }},例如OP。

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

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

进行验证

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

  

在测试期间使用阵列驱动程序并防止存储数据   在会议中坚持下去。

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

检查config / sessions.php

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

答案 1 :(得分:70)

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

您可以通过调用以下方式在表单中发布CSRF令牌:

 {{ csrf_field() }}

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

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

答案 2 :(得分:7)

尝试所有这些。

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

答案 3 :(得分:6)

这是因为 $var = html_escape('<iframe title="YouTube video player" width="480" height="390" src="<url>" frameborder="0" allowfullscreen></iframe>'); $this->email->message($var); 造成的 看看这段代码示例如何正确处理它:

  

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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

某些信息存储在cookie中,该信息与开发中早期版本的laravel相关。因此它与csrf生成的令牌冲突,这些令牌是由另一个版本生成的。只需清除cookie并尝试一下即可。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

在我的情况下,该网站在服务器上很好,但在本地没有。然后我记得我在安全的网站上工作 所以在文件config.session.php中,将变量secure设置为false

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

答案 8 :(得分:1)

我更改了存储权限,错误消失了。这个问题似乎缺乏许可。

sudo chmod -R 775 storage/

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

确保在Web服务器上具有正确的系统时间。在我的情况下,流浪汉机器是在未来(1月26日14:08:26 UTC 2226)所以当然我的浏览器会话cookie中的时间已经过了大约200年以上。

答案 11 :(得分:0)

设置 mbstring.func_overload = 2

它帮助了我

答案 12 :(得分:0)

我想出了两种方法来避免这些错误 1)通过添加受保护的$ except = ['/ yourroute'],可以从定义的根目录禁用csrf令牌检查。 2)只注释\ App \ Http \ Middleware \ VerifyCsrfToken :: class内核中受保护中间件组中的行

答案 13 :(得分:0)

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

答案 14 :(得分:0)

简短答案

register中为app/Http/Middleware/VerifyCsrfToken.php添加路由条目

protected $except = [
        '/routeTo/register'
    ];

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

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

详细信息

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

如果您将网站保持打开状态超过到期时间并尝试发出请求,则将评估此令牌,并且将返回到期错误。因此,要在经过身份验证的用户无法使用的表单(例如注册或登录)上跳过此验证,可以在app/Http/Middleware/VerifyCsrfToken.php中添加除外路由。

答案 15 :(得分:0)

以以下形式添加@csrf 并转到VerifyCsrfToken.php

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

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

答案 16 :(得分:0)

很多次发生是因为您正在回溯测试项目

答案 17 :(得分:0)

解决方案:

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

原因:

在我的情况下,另一个用户使用我的管理控制台登录

答案 18 :(得分:0)

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

答案 19 :(得分:0)

登录以连接到服务器。

搜索错误

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

搜索请求更长。

答案 20 :(得分:-9)

您必须具有文件类型

laravel 中的FileName.blade.php Ruby and Rails 中的FileName.erb.rb

并附加任何一个

  1. {{ csrf_token() }}
  2. <input type="hidden" name="_token" value="{{ csrf_token() }}" >
  3. <meta name="csrf-token" content="{{ csrf_token() }}">