419 页面在 Laravel 中过期,即使添加 CSRF 令牌后

问题描述 投票:0回答:5

我正在开发 Laravel 8 框架, 我已在实时 Cpanel 服务器上添加了该应用程序,然后它开始显示以下错误:

419页已过期

我知道通常缺少 CSRF 令牌将是主要问题,但在此,我添加了 CSRF 令牌, 我正在使用 LARAVElblade 语法,因此添加 LARAVElblade 表单语法“令牌”(CSRF)将直接添加。

 {{ Form::open( [ "url" => \URL::route("front.login.check"), "autocomplete"=>false,"id" => "login_form" ] ) }}

这将自动添加 CSRF, 我尝试过直接添加, 但每个

POST
请求最终都会出现在
419 PAGE EXPIRED
页面上。

我已经检查了什么?

  • CSRF Token
    不缺在
    Form
  • 我也检查了中间件,但在表单提交后此请求未到达中间件,它将进入
    419
    页面
  • 还尝试使用
    php artisan cache:clear
    dump-autoload
    命令,但问题仍然存在。
  • 还向 storage
    vendor
    cache
    文件夹添加了
    755
    权限。

请帮助我解决这个问题我接下来需要检查什么才能解决这个问题?

php laravel post laravel-8 csrf
5个回答
8
投票

Laravel“419 页面已过期”错误故障排除步骤

在测试您的应用程序是否存在此错误之前,应用/完成“步骤 12”之前的所有步骤。

  1. 增加您的会话过期时间(即 24 小时)。
  2. 确保“会话域”与“应用程序 URL”相同。
  3. 确保会话
  4. cookie 被发送回“HTTP”和“HTTPS”浏览器连接的服务器

.env 文件内容应用上述 3 个步骤。

myapp.local 更改为您的应用程序域。

APP_URL="http://myapp.local" SESSION_LIFETIME=1440 SESSION_DOMAIN=myapp.local SESSION_SECURE_COOKIE=false

    确保您
  1. 提交 CSRF 令牌以及您的(PUT
    /
    POST
    /
    DELETE
    /等)HTTP 请求。
    (即:确保此请求参数与您的 HTML 表单请求一起提交
  • <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    )。
  • 如果您在应用程序中发出 AJAX 请求,您可以将所有 AJAX 请求配置为始终发送 CSRF 令牌。
    • 将此“
    • <meta>
      标签”添加到所有主 VIEW 模板/布局的 
      <head>
       标签内。即: 
      resources/views/layouts/app.blade.phpresources/views/layouts/guest.blade.phpresources/views/welcome.blade.php
      • <meta name="csrf-token" content="{{ csrf_token() }}">
        
        
    • 然后,定义所需的 HTTP 请求标头并重新编译应用程序的静态资产 (
    • npm run dev
      )。 
      资源/js/app.js
$.ajaxSetup({ headers: { "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"), "X-Requested-With": "XMLHttpRequest" } });

    自动重新生成您的
  1. 应用程序密钥。 (即:php artisan key:generate
    )。
  2. 清除应用程序缓存。 (即:
  3. php artisan cache:clear
    )。
  4. 确认应用程序调用者在应用程序的“会话”和“缓存”文件夹中拥有
  5. 读取和写入权限。 (即:chmod -R 755 storage && chmod -R 755 "storage/framework/sessions" && chmod -R 755 "bootstrap/cache"
    )。
附录1:

    如果您安装并启用了
  1. Laravel Sanctum,请将您的应用程序域添加到“sanctum 有状态域”的白名单中。

.env 文件内容

myapp.local 更改为您的应用程序域。

SANCTUM_STATEFUL_DOMAINS="myapp.local"
附录2:

    确保您的“会话驱动程序”不为空。
  1. 默认值为“文件”

.env 文件内容

SESSION_DRIVER=file
附录3:

  1. 禁用浏览器缓存。这在您的开发过程中可能是有益的。

  2. 打开网络浏览器,导航到应用程序的主页,重新加载当前页面,忽略缓存的内容。 (即:在

    Windows 上:Shift + F5

    Ctrl + Shift + r
     以及在 
    Mac 上:⌘ + Shift + r
    )。

  3. 测试您的应用程序!检查您是否仍然收到错误。

附录 4(可选):

仅当您到达步骤 12 并且仍然遇到相同错误时,才执行以下步骤。

A.

清除所有网络浏览器缓存和cookie测试您的应用程序!

B.打开一个完全不同的网络浏览器并再次测试。如果您一直使用

Google Chrome / Safari,请尝试使用 Firefox 进行测试。 测试您的应用程序!

C.重新启动计算机并再次测试。

测试您的应用程序!


1
投票
当您将

SESSION_SECURE_COOKIE 标志设置为 true 并且您的请求是在不安全的连接下发出时,也可能会发生这种情况,例如您通过 http://yourdomain.com 而不是 https:/ 访问您的应用程序/yourdomain.com。 set-cookie 标头将被阻止,因为它是在不安全的连接下接收的,从而导致上述会话问题。


0
投票
1-

php artisan route:clear


2-转到 CSRF 中间件并尝试将“*”添加到您的 except 数组中


0
投票
这可能是一种边缘情况,但如果您使用数据库驱动程序以及用户 ID 的正常递增 ID(即 ULID 或 UUID)之外的其他内容,请确保

user_id

 表中的 
sessions
 字段反映您的用户 ID 的正确格式。


-3
投票
当我遇到这种情况时,是因为我忘记在表单中的输入中添加“名称”属性

© www.soinside.com 2019 - 2024. All rights reserved.