【问题标题】:Post request in Laravel - Error - 419 Sorry, your session/ 419 your page has expired在 Laravel 中发布请求 - 错误 - 419 抱歉,您的会话/419 您的页面已过期
【发布时间】:2019-03-06 03:17:06
【问题描述】:

我安装了 Laravel 5.7

向文件\resources\views\welcome.blade.php添加了一个表单

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

添加到文件\routes\web.php

Route::post('/foo', function () {
    echo 1;
    return;
});

发送 POST 请求后:

419 抱歉,您的会话已过期。请刷新并重试。

5.6 版本没有这样的问题。

【问题讨论】:

  • 您是否尝试过添加重定向?您可以致电 return redirect()-&gt;back();,而不是 return;。从我所见,该应用程序在发布请求后无事可做。也许您可以在处理请求后将其重定向到视图。
  • 我遇到了同样的问题。当我切换到数据库会话时,会发生这种情况,当我在.env 中将SESSION_DRIVER 更改回file 时,它工作正常。为什么基于数据库的会话不起作用。
  • 我将您的确切代码复制到了全新的 laravel 5.7 安装中。有效。其他地方有问题。
  • 这个问题是因为token问题。我曾尝试像这样运行相同的代码,但没有错误。您应该提供更多信息,例如会话驱动程序、表单中的 _token 值显示。另外,你可以在这个文件vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php第67行调试自己了解原因
  • 我意识到我将sessions 表用于不同的目的。将此表名称更改为更合适的名称并运行 artisan session:table 并刷新迁移后,一切正常

标签: php laravel csrf


【解决方案1】:

对于某些人,还要确保您的刀片文件以 filename.blade.php 而不是 filename.php 命名,这也会导致 419。

【讨论】:

    【解决方案2】:

    我刚刚更换了浏览器,它工作正常。 如果您已经在表单后添加了@csrf,但它仍然无法正常工作,只需清除浏览器的缓存,使用其他浏览器即可。

    在我的情况下,它工作希望这会有所帮助

    【讨论】:

      【解决方案3】:

      ob_start();

      这个问题花了我两天多的时间解决方法很简单:

      转到public 文件夹并在index.php 的第一行添加此ob_start();

      重要:在浏览器清除现金之后。

      【讨论】:

        【解决方案4】:

        对于 cloudways 用户,

        尝试从应用程序设置中禁用 Varnish(缓存层)。

        【讨论】:

          【解决方案5】:

          经过多次搜索,我找到了解决方案here

          在公共文件夹内的主 index.php 文件中,编辑它并在最顶部写入 ob_start()

          【讨论】:

            【解决方案6】:

            这是我见过几次的问题,通常在使用apache 时出现。

            如果在任何被执行的文件中的开头 &lt;?php 之前有任何杂散字符或换行符,则这些字符由 Web 服务器在准备和发送 cookie 之前发出。

            这会阻止 cookie 发送到客户端,并且客户端必须针对每个请求启动一个新会话。

            不幸的是,唯一的解决方案是查看您创建或修改的每个文件(如果您使用 Git,还不错)并确保 &lt;?php 是每个 php 文件中的第一个字符。

            您可以忽略视图文件,因为它们在发送 cookie 之后才会被使用。

            最有可能的候选者是控制器、服务提供者和路由文件。

            【讨论】:

              【解决方案7】:

              2021,我在应用上述所有解决方案时遇到了这个错误,我的每条路由都抛出 419。我的应用程序在 localhost 上运行良好,但在服务器上运行 419。 然后我在生产中修复.env文件时得到了解决方案,remove sanctum variables来自.env并在config/session.php中设置'secure' =&gt; env('SESSION_SECURE_COOKIE', null)

              【讨论】:

                【解决方案8】:

                在我的情况下,在 routes/web.php 的末尾缺少 ?&gt;

                【讨论】:

                • 同样,我忘记在web.php末尾添加?&gt;
                • 哇。在我的情况下不是完全相同的问题,但是您的解决方案让我检查了这一点,当我这样做时,我注意到 opening &lt;?php 标记 before 的空格,这就是在网站上的每个表单上都导致了 419!奇怪的是,PHP 7.3 并没有发生这种情况,而是在升级到 7.4 后开始的!
                • 事实上,简单地从该文件中添加/删除一个段落具有相同的效果
                【解决方案9】:

                在阅读以下内容之前,请确保您的表单中有 @csrf{{ csrf_field() }} 喜欢

                <form method="post">
                @csrf <!-- {{ csrf_field() }} -->
                ... rest of form ...
                </form>
                

                Laravel 中的 Session Expired 或 419 Page Expired 错误消息出现是因为您的 csrf 令牌验证失败,这意味着 App\Http\Middleware\VerifyCsrfToken::class 中间件已经打开。在表单中已经添加了@csrf刀片指令,这也应该没问题。

                然后要检查的另一个区域是会话。 csrf 令牌验证直接与您的会话相关,因此您可能需要检查您的会话驱动程序是否正常工作,例如配置不正确的 Redis 可能会导致问题。

                也许您可以尝试从.env 文件中切换会话驱动程序/软件,支持的驱动程序如下所示

                Laravel 5、Laravel 6 和 Laravel 7 支持的 Session 驱动程序 (Doc Link)

                • file - 会话存储在 storage/framework/sessions 中。
                • cookie - 会话存储在安全的加密 cookie 中。
                • database - 会话存储在关系数据库中。
                • memcached / redis - 会话存储在这些基于缓存的快速存储之一中。
                • array - 会话存储在 PHP 数组中,不会被持久化。

                如果您的表单在切换会话驱动程序后工作正常,那么该特定驱动程序有问题,请尝试从那里修复错误。

                可能容易出错的情况

                • 由于/storage 目录的权限问题,基于文件的会话可能无法工作(快速谷歌搜索会为您获取解决方案),还请记住,将 777 用于目录绝不是解决方案。

                • 对于数据库驱动程序,您的数据库连接可能错误,或者sessions 表可能不存在或配置错误(根据@Junaid Qadir 的评论,错误的配置部分已被确认为问题) .

                • redis/memcached 配置错误或同时被系统中的其他代码操作。

                执行php artisan key:generate 并生成一个新的应用程序密钥可能是个好主意,该密钥反过来会刷新会话数据。

                清除浏览器缓存HARD,我发现 Chrome 和 Firefox 是罪魁祸首。

                Read more about why application keys are important

                【讨论】:

                • 有时只是浏览器,主要是 Chrome 不会放置 Set-Cookie 会话值,因为它格式错误或不标准。所以 Laravel 不会从 HTTP 请求中找到任何现有的会话值来与从 FORM 中接收到的_token 值进行比较。避免将 SESSION_DOMAIN=... 与 Chrome 和 HTTP Cookie Specs 认为不安全的 IP 一起使用。
                • 我有同样的问题,但我没有经常收到错误。它只是不时发生。我想这意味着会话驱动程序没有问题,因为它在 99% 的时间都可以工作。但是我正在运行一个实时应用程序,并且不时收到客户的投诉。不过,这非常罕见。我正在使用文件会话驱动程序。有人知道为什么会在我的情况下发生这种情况吗?谢谢
                • @TheAngelM97 您可以通过转到登录或注册页面轻松重现此错误。不要做任何事情,也许超过 30 分钟。然后当你点击提交时,419 Page Expired 就会出现。为了可用性,你如何告诉一个简单的用户刚刚发生了什么以及如何解决它?
                【解决方案10】:

                如果您添加了@csrf,那么也会出现错误,请确保您没有阻止 cookie...

                点击 Cookie 并允许链接!

                【讨论】:

                  【解决方案11】:

                  在我的情况下,我在打开嵌入模式视图的表单之前使用 javascript 清除所有输入。愚蠢的是,我没有注意到它会擦除 hidden 输入的值,其中包括 csrf 令牌。尽管name='_token' 的输入条件中有一个例外。当然,我的代码是 splitting 数组中带有下划线的输入名称。
                  必须为hidden 输入例外。

                  【讨论】:

                    【解决方案12】:

                    像这样在.blade.php 文件{{ csrf_field() }}@csrf 上添加表单

                    <form method='POST' action='route("exampleRoute")'>
                       {{ csrf_field() }} or @csrf
                       ....
                       ....
                    </form>
                    

                    【讨论】:

                    • 您的答案与现有答案有什么不同?
                    【解决方案13】:

                    我刚刚经历了这一切,我在这里徘徊寻求答案.. 就我而言,解决方案是清除浏览器历史记录。

                    【讨论】:

                      【解决方案14】:

                      我尝试了此处提供的所有答案。然而,他们都没有在共享主机中为我工作。但是,这里提到的灵魂对我有用How to solve "CSRF Token Mismatch" in Laravell

                      【讨论】:

                        【解决方案15】:

                        转到 config/sessions.php

                        找到行

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

                        改为假

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

                        如果此参数设置为 TRUE,浏览器将要求您使用 HTTPS 协议,否则不会存储会话。因为它是无效的

                        【讨论】:

                          【解决方案16】:

                          虽然表单有@csrf,但它仍然显示419 pages has expired

                          我在 config/session.php 中将 SESSION_SECURE_COOKIE 选项更新为 false 后解决了这个问题

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

                          比清除缓存

                          【讨论】:

                            【解决方案17】:

                            如果您尝试所有这些步骤,它应该可以工作:

                            1. 确保您的会话配置正确,最简单的方法是创建文件并确保存储文件夹具有 chmod 755 权限,然后在您的.env 中进行如下设置,文件会话驱动程序是最简单的设置方法。

                              SESSION_DRIVER=file
                              SESSION_DOMAIN=
                              SESSION_SECURE_COOKIE=false
                              
                            2. 确保缓存文件夹已清除且可写,您可以通过运行以下 artisan 命令来执行此操作。

                              php artisan cache:clear
                              
                            3. 确保文件夹权限设置正确,它们应该配置如下:

                              sudo chmod -R 755 storage
                              sudo chmod -R 755 vendor
                              sudo chmod -R 644 bootstrap/cache
                              
                            4. 确保您的表单包含@csrf 令牌。

                            希望这能解决您的问题。

                            【讨论】:

                            • 权限的 sudo 设置让我的 laravel 彻底崩溃了。
                            • 这对我有用。就我而言,当我尝试在主机而不是本地主机上服务时,我遇到了这个问题。
                            • 我认为你应该保持chmod -R 644 bootstrap/cache可写,否则你可能会得到一个错误。
                            【解决方案18】:

                            在我的情况下,另一个管理员用户使用我的管理面板登录,但无法使用新的 laravel/ui 身份验证登录,并且 419 被触发。

                            解决方案

                            使用隐身标签在新标签中打开,然后再次测试。

                            【讨论】:

                              【解决方案19】:

                              app/Exceptions/Handler.php 中的某行代码解决了我的问题。

                              public function render($request, Exception $exception)
                              {
                                  if ($exception instanceof Illuminate\Session\TokenMismatchException) {
                                      Artisan::call('cache:clear');
                                      Artisan::call('config:cache');
                                      return Redirect::back();
                                  }
                                  return parent::render($request, $exception);
                              }
                              

                              【讨论】:

                                【解决方案20】:

                                您的应用程序的标头中也有 csrf 吗?

                                <meta name="csrf-token" content="{{ csrf_token() }}">
                                

                                【讨论】:

                                  【解决方案21】:

                                  在您的项目上打开命令行 cmd。

                                  1.命令

                                  php artisan config:cache
                                  

                                  2.comand

                                  php artisan route:clear
                                  

                                  【讨论】:

                                    【解决方案22】:

                                    要解决此错误,您首先需要将以下命令之一插入到表单标签中。

                                    @csrf{{ csrf_field }}

                                    如果您的问题没有解决,请执行以下操作:(注意以上命令之一必须在表单标签中)

                                    1.在表单标签中插入以下命令之一 @csrf{{ csrf_field }}

                                    2.打开.env文件,将SESSION_DRIVER部分的值改为“文件”。

                                    3.那么你应该重置 laravel 缓存。在终端输入以下命令

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

                                    php artisan config:cache

                                    4.在最后一步中,从服务中拔下项目并再次单击 php artisan serve

                                    希望您的问题得到解决

                                    【讨论】:

                                      【解决方案23】:

                                      对我来说,一旦会话无效并且用户尝试提交发布请求,就会出现错误。 csrf_token 不再有效。所以我通过更改 Exceptions 目录中的 Handler.php 来克服它,并尝试像这样捕获令牌不匹配异常。

                                      渲染函数是这样的

                                      public function render($request, Exception $exception)
                                      {
                                          return parent::render($request, $exception);
                                      }
                                      

                                      然后我把它修改成这样

                                      public function render($request, Exception $exception)
                                      {
                                      
                                          if ($exception instanceof \Illuminate\Session\TokenMismatchException){ // <<<=========== the Code
                                              if ($request->expectsJson()) {
                                                  return response()->json(['error' => 'Unauthenticated.'], 401);
                                              }
                                      
                                              return redirect('/home')->with('message', 'You page session expired. Please try again');
                                          }
                                          return parent::render($request, $exception);
                                      }
                                      

                                      只需选择可以处理令牌刷新操作的路由。

                                      【讨论】:

                                        【解决方案24】:

                                        在我的情况下,删除 bootstrap/cache 解决了问题

                                        【讨论】:

                                          【解决方案25】:

                                          只需更改 .env

                                          SESSION_DRIVER=cookie
                                          

                                          【讨论】:

                                            【解决方案26】:

                                            如果你已经有了 csrf 指令,你可能已经改变了会话的运行方式。

                                            config/session.php 中,检查 'secure' 字段。如果您的服务器上没有 https,它应该为 false。

                                            您也可以将SESSION_SECURE_COOKIE=FALSE 放在您的.env 文件(根目录)中。

                                            【讨论】:

                                              【解决方案27】:

                                              实际上 CSRF 是一个基于会话的令牌。 在路由组中添加您的路由并添加控制会话的中间件。

                                              web 是 laravel 中默认的中间件,它可以控制会话请求。

                                              Route::group(array('middleware' => ['web']), function () {
                                                Route::post('/foo', function () {
                                                   echo 1;
                                                   return;
                                                });
                                              });
                                              

                                              【讨论】:

                                                【解决方案28】:

                                                419 |页面这个错误意味着 laravel 安全问题它意味着 csrf 令牌字段没有正确使用。

                                                使用{{csrf_field}} 你的问题就会得到解决。

                                                【讨论】:

                                                  【解决方案29】:

                                                  我在开发环境中遇到了同样的问题。已使用http://127.0.0.1:8000 而不是http://localhost:8000 解决。

                                                  【讨论】:

                                                    【解决方案30】:

                                                    我只想说,确保生成 csrf 令牌,有时它只是一个空数组,例如,如果您不在 js 查询内部生成,则以中继器形式。

                                                    【讨论】:

                                                      猜你喜欢
                                                      • 2019-05-05
                                                      • 2019-04-27
                                                      • 2019-09-20
                                                      • 2019-03-23
                                                      • 2021-09-07
                                                      • 1970-01-01
                                                      • 2020-05-22
                                                      • 2022-06-11
                                                      相关资源
                                                      最近更新 更多