【问题标题】:laravel 5.5 The page has expired due to inactivity. Please refresh and try againlaravel 5.5 页面由于不活动而过期。请刷新并重试
【发布时间】:2018-02-19 07:59:29
【问题描述】:

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

'页面因不活动而过期。请刷新并尝试 再次。'

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

谁能告诉我这是为什么以及如何解决它?因为我当然需要 POST 方法。

【问题讨论】:

标签: php laravel


【解决方案1】:

此问题来自失败的 CSRF 令牌验证。所以要么你没有发布一个,要么你发布了一个不正确的。

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

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

{{ csrf_field() }}

或在app/Http/Middleware/VerifyCsrfToken.php 中排除您的路线(出于安全原因不推荐):

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

【讨论】:

  • 对于查看此内容的任何其他人,您还可以在您的站点标题中放置一个元标记,该标记将用于大多数请求。
  • @Erik 我不确定第二种方法是否合适。如果我们排除 VerifyCsrfToken.php 中的路由,我认为该路由将容易受到 CSRF 攻击
  • 第二种方法会带来安全风险,这是真的。但是,在某些用例中您可能不想进行 CSRF 验证。比如 AJAX 调用。
  • @ErikBaars 如果您从 SPA 向后端执行 AJAX 请求,您仍然希望使用 CSRF。我使用 Laravel 执行此操作,方法是在 SPA 的初始请求中获取 CSRF 令牌,然后通过使用 HTTP 拦截器从响应标头获取它来维护更新的令牌。
  • 在我的例子中,Laravel Auth 登录系统给出了“过期页面错误”。我必须检查我的 /resources/views/auth/login.blade.php 才能有这一行: {{ csrf_field() }} 。就是这样!
【解决方案2】:

就我而言,我收到了相同的错误消息,然后发现我错过了为表单字段添加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>

【讨论】:

    【解决方案3】:

    每当您在应用程序中定义 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

    【讨论】:

    • 这不是完美的解决方案。因为在用户的情况下,他们如何知道他们必须删除缓存。
    • 当我们更新我们的应用程序时,浏览器可能仍然使用旧文件。如果您不清除缓存,旧文件可能会在您申请时访问问题。有关更多详细信息,请阅读此laravel.com/docs/5.5/csrf
    【解决方案4】:

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

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

    然后删除 .env 文件中的 SESSION_DOMAIN

    【讨论】:

    • 您能详细说明一下吗?为什么,它有什么作用?
    • 这在本质上是不是相当于这个代码:'domain' =&gt; null, ?
    • 此外,我认为这解决了我的问题的第一个结论是错误的。这实际上是我的浏览器缓存问题。我首先在浏览器的隐身窗口中打开了这个页面,然后它就可以工作了。
    【解决方案5】:

    就我而言,我添加了 ob_start();在服务器上我的 index.php 顶部,一切似乎都运行良好。

    【讨论】:

    • 兄弟你救了我...唯一对我有用的解决方案
    【解决方案6】:

    我有同样的问题。在 chrome 中使用“清除浏览数据”。或许能解决你的问题。

    【讨论】:

    • 这不是完美的解决方案。因为在用户的情况下,他们如何知道他们必须删除缓存。
    • 确实不是最好的解决方案。
    • 经过大量搜索后它对我有用,最终这个答案解决了我的问题
    【解决方案7】:

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

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

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

    【讨论】:

      【解决方案8】:

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

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

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

      【讨论】:

      • 我搜索了几个小时,这也是我的确切问题,但我升级到了 5.7。感谢分享!
      【解决方案9】:

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

      SESSION_DOMAIN=myapp.me

      当我把它放回 null 时,一切正常。

      【讨论】:

        【解决方案10】:

        从 CSRF 保护中排除 URI:

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

        通常,您应该将这些类型的路由放在 RouteServiceProvider 应用于 routes/web.php 文件中的所有路由的 Web 中间件组之外。但是,您也可以通过将路由的 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/*',
            ];
        }
        

        【讨论】:

          【解决方案11】:

          {{csrf_field()}} 放入您的form 标签

          【讨论】:

            【解决方案12】:

            首先,在表单中包含 csrf。

            {{ csrf_field() }}
            

            如果问题没有解决,则在 index.php 的开头使用ob_start();

            <?php ob_start();
            

            【讨论】:

              【解决方案13】:

              如果您已在表单中包含 CSRF 令牌。然后,您可能会因为表单中的缓存数据而收到错误页面。

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

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

              在运行这些命令的同时尝试清除浏览器缓存

              【讨论】:

                【解决方案14】:

                如果您的配置已设置:SESSION_DRIVER=file 您必须检查您的会话目录是否可写。检查storage/framework/session

                【讨论】:

                • 同时检查您的磁盘是否已满。花了我几个小时才意识到它无法将会话文件写入磁盘......
                【解决方案15】:

                就我而言,在我的一个配置文件中&lt;?php 之前有“space”。 这解决了我的问题。

                【讨论】:

                  【解决方案16】:

                  只需将此代码放在表单中

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

                  【讨论】:

                  • /* 创建你的表格*/
                  【解决方案17】:

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

                  SESSION_DRIVER=yourwebsite.com

                  【讨论】:

                    【解决方案18】:

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

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

                    【讨论】:

                    • “在您的表单中”是什么意思?为什么要直接回显某些内容而不使用 Twig 模板?
                    • “在您的表单内”是指在您的
                      标签内。您可以使用上面的代码而无需回显。
                    【解决方案19】:

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

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

                    【讨论】:

                      【解决方案20】:

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

                      1.首先你需要在 laravel 中使用 而不是 {!!Form::open() !!} {!! close() !!}
                      2.第二你最开始你的行动是https://www.example.com +your Route

                      不要在你的网址中忘记 www!!!

                      【讨论】:

                        【解决方案21】:

                        在我的情况下,同样的问题是因为我忘记在隐藏输入字段的末尾添加&gt;,如下所示:&lt;input type="hidden" name="_token" value="{{ Session::token() }}"

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

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

                        【讨论】:

                          【解决方案22】:

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

                          或者尝试删除代码中最近的 Html 注释... 或者将 Html Comment 更改为 Php Comment... 或者尝试运行 Any Worng artisan 命令,如 php artisan clean browser 并查看它是否输出任何 HTML 注释数据以及错误...

                          【讨论】:

                            【解决方案23】:

                            我们通过从 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');
                            

                            【讨论】:

                              【解决方案24】:

                              我知道这个问题已经得到了满意的回答,但我想提一下对我来说有效的修复方法。我添加了{{ csrf_field() }},但它仍然不起作用。

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

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

                              【讨论】:

                                【解决方案25】:

                                我的问题通过在表单标签中添加@csrf 解决了

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

                                larvel_fix_error.png

                                【讨论】:

                                  【解决方案26】:
                                  1. 可能是 csrf 令牌 在您的表单中没有。您必须使用@crsf{{ csrf_field() }}

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

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

                                    并清除浏览器缓存。

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

                                    php artisan key:generate
                                    

                                  【讨论】:

                                    【解决方案27】:

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

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

                                    【讨论】:

                                      【解决方案28】:

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

                                      就我而言,我的环境:

                                      Laravel:5.5

                                      PHP:7.2

                                      SSL:生产

                                      阿帕奇

                                      CENTOS

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

                                      并且推送时的所有文件夹都具有 0775 权限(继承自 git 用户)。当 ansinble 运行时,它会将这个权限复制到所有文件夹。例如,在编写安装时,所有供应商文件夹也具有此权限。

                                      csrf 的政策是阻止被认为不安全的内容,尤其是在您使用加密环境 (SSL) 时。

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

                                      【讨论】:

                                        【解决方案29】:

                                        在我的情况下,这似乎是我的网络浏览器(Android 版 Firefox)或具有完整存储空间的智能手机的问题。在其他浏览器和设备中它可以工作。顺便说一句,这个问题只有在我通过表单发送文件时才会出现,我意识到我目前无法通过这个浏览器在任何网站上从我的智能手机上传文件,例如https://filebin.net

                                        【讨论】:

                                          【解决方案30】:

                                          进入 App/Kernel.php 和评论 \App\Http\Middleware\VerifyCsrfToken::class.

                                          【讨论】:

                                          • 这会同时禁用 CSRF 验证,不建议这样做。
                                          猜你喜欢
                                          • 2018-09-16
                                          • 2018-07-22
                                          • 2018-03-01
                                          • 1970-01-01
                                          • 2018-05-07
                                          • 2018-08-31
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2018-02-10
                                          相关资源
                                          最近更新 更多