laravel 5.5由于不活动,该页面已过期。请刷新并重试

时间:2017-09-11 06:36:36

标签: php laravel

我是Laravel的新手,我有一个我不明白的问题。 我的项目中有一个日志表单,我的方法是 POST 。当我尝试请求时,结果是:

  

'由于不活动,页面已过期。请刷新并尝试   再次'。

但如果我将方法更改为 GET ,它可以正常工作。

有人可以告诉我为什么会这样,以及如何解决它?因为我当然需要POST方法。

30 个答案:

答案 0 :(得分:151)

此问题来自CSRF令牌验证失败。因此,要么您没有发布一个,要么发布了错误的一个。

它适用于GET的原因是,对于Laravel中的GET路由,没有发布CSRF令牌。

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

{{ csrf_field() }}

或在app/Http/Middleware/VerifyCsrfToken.php中排除您的路线(不建议由于安全):

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

答案 1 :(得分:31)

在我的情况下,我收到了相同的错误消息,然后发现我错过了为表单字段添加csrf_token。然后添加csrf_token

使用将成为

的表单助手
{{ csrf_field() }}

或者没有表格助手,

<input type="hidden" name="_token" value="{{ csrf_token() }}">

如果这不起作用,那么 -

刷新浏览器缓存

现在可能会有效,谢谢。

Laravel 5.6更新

Laravel集成了新的@csrf而不是{{ csrf_field() }}。现在看起来更加美好。

<form action="">
   @csrf
   ...
</form>

答案 2 :(得分:7)

无论何时在应用程序中定义HTML表单,都应在表单中包含隐藏的CSRF令牌字段,以便CSRF保护中间件可以验证请求。您可以使用csrf_field帮助程序生成令牌字段:

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

它不起作用,然后刷新浏览器缓存,现在它可能会起作用,

有关详细信息,请打开链接: - CSRF Protection in Laravel 5.5

<强>更新

Laravel 5.6使用Blades模板,非常简单。

<form method="POST" action="/profile">
    @csrf
    ...
</form>

有关详细信息,请打开链接: - CSRF Protection in Laravel 5.6

答案 3 :(得分:3)

这是因为您使用的是Laravel安装中的默认CSRV中间件。要解决此问题,请从Kernel.php中删除此行:

\App\Http\Middleware\VerifyCsrfToken::class,

如果您构建API,这很好。但是,如果您要构建网站,则这是安全验证,因此请注意其风险。

答案 4 :(得分:3)

验证您的config / session.php文件是否包含此行

'domain' => env('SESSION_DOMAIN', null),

然后删除.env文件中的SESSION_DOMAIN

答案 5 :(得分:2)

尝试了几种解决问题的不同解决方案,但没有成功。

我遇到的问题是从laravel 5.0升级到5.5而忘记更新config / session.php

如果有人遇到问题,请尝试更新config / session.php以匹配您正在运行的Laravel上的版本

答案 6 :(得分:2)

在我的情况下,我的一个配置文件中hvshow(holoviews_object, 'bokeh') 前面有'空格'。 这解决了我的问题。

答案 7 :(得分:2)

{{csrf_field()}}放入form标记

enter image description here

答案 8 :(得分:2)

我有同样的问题。使用&#39;清除浏览数据&#39;在铬。也许解决你的问题。

答案 9 :(得分:1)

只需将此代码放在表单

中即可
<input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>" />

答案 10 :(得分:1)

我遇到了同样的错误,所以我刚从我的.env文件中删除了这一行

SESSION_DRIVER = yourwebsite.com

答案 11 :(得分:1)

就我而言,我添加了ob_start();位于服务器上 index.php 的顶部,一切似乎都正常。

答案 12 :(得分:1)

如果您的配置已设置:SESSION_DRIVER = file,您必须检查您的会话目录是否可写。检查存储/框架/会话

答案 13 :(得分:1)

仍有人遇到此问题,请在表单中使用以下代码,如下所示。

 echo '<input type = "hidden" name = "_token" value = "'. csrf_token().'" >';

答案 14 :(得分:1)

首先,在表单中包含csrf。

{{ csrf_field() }}

如果问题仍未解决,请在index.php的开头使用ob_start();

<?php ob_start();

答案 15 :(得分:0)

就我而言,这似乎是Web浏览器(适用于Android的Firefox)或具有完整存储空间的智能手机中的问题。在其他浏览器和设备中,它可以工作。顺便说一句,该问题仅在我通过表单发送文件时发生,我意识到我目前无法在https://filebin.net之类的任何网站上通过此浏览器从智能手机上传文件。

答案 16 :(得分:0)

我们通过从Router.php复制路由而不是使用Auth :: routes()来实现,这些是您需要的路由:

Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

答案 17 :(得分:0)

我最近遇到了这个问题,尝试了这里提出的所有解决方案(以及互联网),但都没有成功5天。

在我的情况下,我的环境:

Laravel :5.5

PHP :7.2

SSL :生产

Apache

CENTOS

问题是我已经使用git --bare存储库和ansimble自动化了部署。

所有推送时的文件夹均具有权限 0775 (从git用户继承)。运行ansinble时,它将此权限复制到所有文件夹。例如,在进行安装时,所有供应商文件夹也都具有此权限。

csrf 具有阻止被认为不安全的内容的策略,尤其是在使用加密环境(SSL)的情况下。

仅当我决定手动执行部署,压缩项目,上载,解压缩并运行命令以生成缓存和依赖项时,我才意识到问题。然后我意识到这种方式所有文件夹都具有权限 0755 (从系统用户继承)。这是被认为是安全的默认权限。

答案 18 :(得分:0)

如果仍在寻找此问题的答案。对我来说,这发生在我在本地服务器和生产服务器之间切换并登录两个站点时。要解决此问题,只需清除会话即可。

只需在'expire_on_close' => true中设置config\session.php并重新启动浏览器

答案 19 :(得分:0)

从CSRF保护中排除URI:

有时您可能希望从CSRF保护中排除一组URI。例如,如果您正在使用Stripe处理付款并使用其Webhook系统,则您将需要从CSRF保护中排除您的Stripe Webhook处理程序路由,因为Stripe不知道要发送到您的路由的CSRF令牌。

通常,您应将这些类型的路由放置在RouteServiceProvider应用于所有路由的Web中间件组之外,该路由在route / web.php文件中。但是,您也可以通过将其URI添加到VerifyCsrfToken中间件的$ except属性中来排除路由:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}

答案 20 :(得分:0)

我遇到了同样的问题,我尝试了许多解决方案。但没有一个对我有用。然后我发现由于某种原因,我在.env文件中使用了它:

SESSION_DOMAIN = myapp.me

当我将其重新设置为null时,一切都很好。

答案 21 :(得分:0)

如果您需要使用Javascript更改表单操作,您将遇到同样的问题

1. first ,您需要使用 代替laravel中的{!!Form::open() !!} {!! close() !!}
2. second 您最开始从https://www.example.com +your Route

开始行动

请勿在您的网址中忘记www !!!

答案 22 :(得分:0)

只需在表单标签内添加@csrf

或者您可以在标头中包含csrf_token,以随每个请求发送。

答案 23 :(得分:0)

如果您已经在表单中添加了 CSRF令牌。然后,可能由于表单中的缓存数据而导致出现错误页面。

打开终端/命令提示符,然后在项目根目录中运行这些命令。

  1. php artisan cache:clear
  2. php artisan config:clear
  3. php artisan route:clear
  4. php artisan view:clear

还要尝试清除浏览器缓存以及运行这些命令。

答案 24 :(得分:0)

我的问题已解决,只需在表单标签中添加@csrf

Laravel 5.6不支持{{ csrf_field() }},只需添加@csrf代替{{ csrf_field() }}

larvel_fix_error.png

答案 25 :(得分:0)

在我的情况下导致同样的问题,因为我忘了在隐藏的输入字段的末尾添加>,如下所示:<input type="hidden" name="_token" value="{{ Session::token() }}"

所以,我通过添加它来修复它:

<input type="hidden" name="_token" value="{{ Session::token() }}">

答案 26 :(得分:0)

我知道这个问题得到了圆满的回答,但我想提一下在我的案例中有效的修复方法。我添加了{{ csrf_field() }},但它仍然没有用。

然后我记得我为了开发目的而阻止了所有的cookie,这在你更改页面并想要刷新它时会很好。

一旦我更改设置以停止阻止MS Edge browser中的所有Cookie,问题就会消失。

答案 27 :(得分:0)

很有趣,但它对我有用。我意识到这是由于laravel代码中的默认HTML TAG而引起的。 使用/ * * /或{{ - - }}代替

或尝试在您的代码中删除最近的Html Coment ... 或者将Html评论改为Php评论...... 或尝试运行任何Worng工匠命令,如php artisan clean browser并查看是否输出任何HTML评论数据及其错误...

答案 28 :(得分:-1)

  1. 您的表单中可能没有 csrf令牌。您必须使用@crsf{{ csrf_field() }}

  2. 如果在表单上使用csrf。它可能是缓存。清除您的应用缓存。

    php artisan cache:clear
    php artisan view:clear
    php artisan cache:clear
    

    并清除浏览器缓存。

  3. 如果再次显示错误,则创建一个新密钥

    php artisan key:generate
    

答案 29 :(得分:-3)

进入 App/Kernel.php并发表评论 \App\Http\Middleware\VerifyCsrfToken::class