为什么添加令牌后会出现 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 clearcache
和 composer 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将博客快速绑定到占位符。
我有一个博客 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 clearcache
和composer 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将博客快速绑定到占位符。