【发布时间】:2021-11-23 17:05:43
【问题描述】:
为什么我在提交表单时收到 419 错误。我尝试更改环境并启用调试 true。但只是让 419 页面过期仍然没有收到错误。我知道为什么由于缺少 crsf 字段而收到此页面.但我想查看页面过期以外的实际错误。
【问题讨论】:
-
你使用的是什么版本的 Laravel?
-
我使用的是最新版本 5.8
标签: laravel form-submit
为什么我在提交表单时收到 419 错误。我尝试更改环境并启用调试 true。但只是让 419 页面过期仍然没有收到错误。我知道为什么由于缺少 crsf 字段而收到此页面.但我想查看页面过期以外的实际错误。
【问题讨论】:
标签: laravel form-submit
在表单字段中添加@csrf 标记。
<form action="" method="">
@csrf
.
.
</form>
逻辑如下:
@csrf 或 {{csrf_field()}}
使用csrf_token 创建输入。 Laravel 发布请求搜索 _token。如果它不存在,它看起来是x-csrf-token。
在这个文件中:
laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken
在tokensMatch().
如果令牌不存在,则抛出异常。
在这里:laravel/framework/src/Illuminate/Foundation/Exceptions
prepareException()
如果您使用的是 Ajax 调用,只需在发送方法之前添加
beforeSend: function(xhr, type) {
if (!type.crossDomain) {
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
}
},
别忘了添加 Meta 标签
<meta name="csrf-token" content="{{ csrf_token() }}">
然后它中止 419。我的意思是没有真正的错误。它只是中止错误页面。
【讨论】:
您没有看到实际错误的原因是因为 Laravel 处理 HttpExceptions 通过检查文件是否存在特定 HTTP 错误代码并呈现该代码,而不是使用 Whoops 或 Synfony 呈现错误。
开箱即用,Laravel 带有 401、403、404、419、429、500 和 503 错误页面的错误文件。它们位于:
/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/views
如果您想在启用调试且未投入生产时禁用此行为,则可以将以下方法添加到您的 app/Exceptions/Handler.php 类:
protected function renderHttpException(HttpExceptionInterface $e)
{
if (app()->environment() !== 'production' && config('app.debug')) {
return $this->convertExceptionToResponse($e);
}
return parent::renderHttpException($e);
}
以上将阻止 Laravel 检查是否存在异常的特定错误文件。
【讨论】:
我正在拉扯我的头发,因为在我的情况下它只是发生在我试图将文章帖子更新到我的后端的单个 POST url 上。
令牌始终存在,会话文件夹没有权限问题,没有空格,重新生成应用程序密钥没有帮助。我已经没有线索了,尤其是当更新不同的文章帖子效果很好时。
在我的情况下,帮助清除整个应用程序的 Cloudflare 缓存。 (我的 Laravel 应用程序位于 Cloudflare DNS 后面)。清除缓存后,我就可以在仪表板中提交表单。
我仍然不知道罪魁祸首是什么,但是因为错误 419 现在已经消失了,所以我发布了这个 - 也许它会有所帮助,如果你知道罪魁祸首,请发表评论。
【讨论】: