【问题标题】:Redirect "method is not supported for this route"重定向“此路由不支持方法”
【发布时间】:2019-12-21 17:07:43
【问题描述】:

我有一个用户可以发布到的 API 端点

Route::post('report', 'Auth\ReportController@report')

因为它只支持 POST 请求,如果用户去mydomain.com/api/report他们会得到错误

此路由不支持 GET 方法。

我不希望用户在他们的地址栏中输入此内容并收到此错误。所以我做了一个重定向到家的get

 Route::get('report', function () {
    return redirect('home');
});

这是处理这个问题的正确方法吗?有没有更优雅的解决方案?此外,是否可以列出多条路线并将它们全部重定向到家,例如这样的:

 Route::get(['report', 'issuer'], function () {
        return redirect('home');
    });

【问题讨论】:

  • 只是一个错误有什么问题?
  • 如果路由不支持某个方法,我本来希望收到 405 Method Not Allowed。正是为此用例添加了 405 状态代码。如果用户也不允许访问 POST 路由,则返回 403 Forbidden 是有意义的。

标签: laravel routes


【解决方案1】:

我强烈建议您不要管它,因为不允许方法的 405 消息对于 API 使用者和许多人来说都非常有用。

但是如果你必须这样做,我建议你使用异常处理程序

App\Exceptions\Handler(laravel自带的样板可以在https://github.com/laravel/laravel/blob/master/app/Exceptions/Handler.php看到)

use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;


class Handler extends ExceptionHandler
{
    public function render($request, Exception $exception)
    {
        if (!$request->expectsJson() && $exception instanceof MethodNotAllowedHttpException) {
            return redirect('home');
        } 

        return parent::render($request, $exception);
    }
}

这应该会导致所有MethodNotAllowedHttpException 被重定向到主页。

请注意,我还使用条件 !$request->expectsJson(),因为期望 JSON 的客户端通常不想知道重定向,而是希望收到真实状态代码的通知

【讨论】:

  • 感谢您的洞察力,我决定不理会它,但从中学到了一些东西!
【解决方案2】:

更优雅:

Route::permanentRedirect('/report', '/home');

更好的方法是为您的 API 使用 API 路由,如果您将 API 路由放在 routes/api.php 中,它会自动为它们添加前缀 /api/[route]

要将路由列表重定向到主页,请在底部使用通配符路由并在控制器中定义重定向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 2019-08-23
    • 2019-11-14
    • 2019-10-16
    • 1970-01-01
    • 2020-04-23
    • 2020-04-13
    • 2020-12-06
    相关资源
    最近更新 更多