【问题标题】:Laravel 405 method not allowed on AJAX requestAJAX 请求中不允许使用 Laravel 405 方法
【发布时间】:2019-03-25 06:59:26
【问题描述】:

该代码在我的本地开发环境中运行良好,但在我将其上传到服务器时会出现405 method not allowed 异常。 this question 和 this question 的解决方案对我不起作用。

这是控制器。

    public function DeleteMultipleProjects(Request $request){
        $json = $request->projectsToDelete;
        $to_delete = collect([]);

        $projects = json_decode($json);
        foreach ($projects as $project) {
            $to_delete->push($project->id);
        }

        Project::destroy($to_delete);
    }

这是路由文件中的相应条目。

Route::post('/ajax/dashboard/delete-projects', 'ProjectController@DeleteMultipleProjects');

这是对 URL 的 AJAX 调用。

    $.ajax({
        url: '/ajax/dashboard/delete-projects',
        method: 'POST',
        data: {
            projectsToDelete: JSON.stringify(vThis.selectedProjects),
        },
        complete: function(){
            vThis.refreshProjects();
        }
    });

这是示例测试用例的数据。

[{"id":140,"name":"a","updated_at":"Sun, Oct 21, 2018 4:31 AM","selected":true,"selectHovering":false},{"id":139,"name":"New Project","updated_at":"Sun, Oct 21, 2018 4:31 AM","selected":true,"selectHovering":false}]

我怎样才能克服这个错误,为什么这只发生在生产环境中?

编辑值得注意的是,我在整个应用程序中对路由进行了其他 AJAX 调用,它们工作正常。

【问题讨论】:

  • 请求是否直接发送到应用服务器?
  • 什么意思? AJAX 请求直接发送到服务器,是的。值得注意的是,我在整个应用程序中对路由进行了其他 AJAX 调用,它们运行良好。
  • 我在澄清你的环境。通常,在企业环境中,请求通过分层架构进行路由。
  • 哦是的,不,这里不是这样。
  • 请从 devtools 发布请求信息。

标签: javascript ajax laravel laravel-5


【解决方案1】:

您似乎缺少 csrf 令牌

将您的 ajax 发布数据更新为:

$.ajax({
    url: '/ajax/dashboard/delete-projects',
    method: 'POST',
    data: {
        projectsToDelete: JSON.stringify(vThis.selectedProjects),
        _token: '{{ csrf_token() }}',
    },
    complete: function(){
        vThis.refreshProjects();
    }
});

【讨论】:

  • 我以前全局设置了 csrf 令牌。很抱歉没有提到这一点。
  • 我遇到的另一个常见问题是在到达您定义的路线之前可以捕获路线。将ajax的路由定义放在路由列表的顶部
  • 缺少 CSRF 令牌不会导致 405 错误。
  • @Devon 我通过更改表单数据以发送单个线性数组来解决它。我已经添加了答案。
【解决方案2】:

Laravel 中的 405 错误意味着您正在使用的 HTTP 方法的路由不存在。

如果您在生产环境中收到此错误但不是在本地,这表明您的路由文件已过时或已被缓存。

清除你的路由缓存:

php artisan route:clear

验证您的 POST 路由是否存在:

php artisan route:list --path=ajax/dashboard/delete-projects

如果 route:list 确认您的 POST 路由存在但您仍然收到 405,则可能导致缓存路由的另一件事是 opcache 没有重新验证时间戳,您可能需要重新启动 php 进程才能清除。

【讨论】:

  • 尝试了所有这些,仍然得到 405。
  • 然后发布您的路由列表输出和您的 opcache 设置。您是否重新启动了 php 进程以清除 opcache?
【解决方案3】:

问题出在我发送的数据中。我不知道为什么,但我的服务器不喜欢整个项目数组,所以我更新了它以仅发送我想删除的 ids 数组,因此将控制器更新为 @987654322 @请求。如果有人有解释,我很好奇。

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2019-05-10
    • 1970-01-01
    • 2020-03-19
    • 2018-08-19
    相关资源
    最近更新 更多