为什么添加令牌后会出现 419 页面?

Why do I get a 419 page when I have my token added?

我有一个博客 post,我想在它自己的视图中进行编辑,但是当我进行编辑更改时,我得到一个 419 页面。

这是我的编辑视图,用于编辑由其 id 指定的相关博客:

<div id="body" style="color:#333">
    <h1 style="color:#333">Update blog</h1>

    <form method="POST" action="{{route('blogSingle',$blog->id)}}">
        @method('put')
        @csrf
        <div class="field">
            <label for="title" class="label" style='font-size:1.2rem'>Title</label>

            <div class="control">
                <input type="text" class="input" name="title" id="title" placeholder="Blog Title" value="{{$blog->title}}">
            </div>

        </div>
        <div class="field">
            <label for="body" class="label" style='font-size:1.2rem'>Body</label>

            <div class="control">
                <textarea type="text" class="textarea" name="body" id="body" placeholder="Blog Description">{{$blog->body}}</textarea>
            </div>

        </div>

        <div class="field is-grouped">
            <div class="control">
                <button type="submit" class="btn btn-secondary">Submit</button>
            </div>
        </div>
    </form>
</div>

我还有每个博客的视图,在其中,我单击一个按钮重定向到博客编辑视图,如下所示:

<div id="body">
    {{-- Add a variable blog post here --}}
    <h1><span>blog single post</span> <span><a href="{{route('blog-edit',$blog->id)}}" class="btn btn-secondary">Edit Blog</a></span></h1>
    <div>
        <img src="images/grew-a-mustache.jpg" alt="Mustache">
        <div class="article">
            <h2 class="lead">{{$blog->title}}</h2>
            <p class="lead">
                {{$blog->body}}
            </p>
        </div>
    </div>
</div>

我涉及的路线如下:

Route::get('blog-single/{blog}',[BlogController::class,'show'])->name('blogSingle');
Route::get('blog-single/{blog}/edit', [BlogController::class, 'edit'])->name('blog-edit');
Route::put('blog-single/{blog}',[BlogController::class, 'update']);

为什么我仍然收到 419 页面已过期?我什至在发送前检查了页面,我在这里清楚地看到了我的令牌:

仅当 VerifyCsrfToken 中间件无法验证您的令牌时才会抛出 419。 @csrf 并不能保证您的令牌不会失败。您的令牌可能失败的原因:

  • 您的会话有不同的令牌;检查 session()->token() 的结果,看看它是否与 @csrf 字段中的标记匹配。如果没有,请尝试 session()->flush() 并在必要时重新验证。
  • 您在 @csrf 之后输入了另一个以 _token 作为名称的表单,它覆盖了 CSRF
  • 你有中间件来操纵令牌
  • 你弄乱了 vendor 文件,所以 tokensMatch 功能没有正常运行(如果你认为你已经这样做了,你可以删除你的 vendor 文件夹,然后 运行 composer clearcachecomposer install)

我想补充一点,你没有路由到你的更新方法:

<form method="POST" action="{{route('blogSingle',$blog->id)}}">

正在调用显示方法:

Route::get('blog-single/{blog}', [BlogController::class,'show'])->name('blogSingle');

有效,因为您指定的方法与 URL 相同,但这不是好的做法。如果您显式调用更新路由(您甚至还没有给出名称)会更好。使用占位符名称而不是让路由按顺序填充占位符也是更好的做法:

Route::put('blog-single/{blog}',[BlogController::class, 'update'])->name('blog-update');

<form method="POST" action="{{route('blog-update', ['blog' => $blog])}}">

您还可以使用compact将博客快速绑定到占位符。