laravel: 无法接受没有 csrf 的 post 请求

laravel: can not accept post request without csrf

我已经添加到例外:

    protected $except = [
        'pay/finish'
    ];

但我还是得到 MethodNotAllowedException

路线在web.php

中定义
Route::post('/pay/finish', ['as' => 'pay.finish', 'uses' => 'PaymentController@finish']);

post 请求来自另一个域。

您通常不会从无效的 CSRF 令牌中获得 MethodNotAllowedException。我通常会收到来自 CSRF 问题的 419 响应。

但是,假设 CSRF 令牌是问题所在,您可以将路线从 web.php 移至 api.php。请注意,这会将前缀 api/ 添加到 URL.

检查 CSRF 令牌的中间件在您的内核中应用于 web.php 中的所有路由,但不应用于 api.php

中的所有路由

您可以通过查看 App\Http\Kernel 文件并注释掉 \App\Http\Middleware\VerifyCsrfToken::class from:

来验证 CSRF 检查是否真的是问题所在
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

如果你的路由有效,它是 CSRF,你可以将路由移动到 API 路由文件,并在 api/pay/finish 处点击 api 前缀。

如果不是,那么我建议您查看是什么调用了您的路由,并检查调用了正确的 http 方法。确定是发送了POST请求吗? 您是否在表单中指定了 _method 输入,Laravel 检查 POST 请求以将其突变为 PUTPATCH 的编辑路径?