AJAX 请求中不允许使用 Laravel 405 方法

Posted

技术标签:

【中文标题】AJAX 请求中不允许使用 Laravel 405 方法【英文标题】:Laravel 405 method not allowed on AJAX request 【发布时间】: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 发布请求信息。 【参考方案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 @请求。如果有人有解释,我很好奇。

【讨论】:

以上是关于AJAX 请求中不允许使用 Laravel 405 方法的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Ajax更新方法不允许405

Laravel 中不允许使用奇怪的 405 方法

405 方法不允许,PATCH 不工作。 Laravel、Ajax、Jquery、引导模式

当我使用 ajax 发布请求时,为啥在我的 live laravel 项目中显示 404 和 405

为啥来自 Vuejs 的 Laravel 8 的 AJAX POST 请求会引发 405(不支持的方法)错误?

错误 405(发出 Ajax 请求时不允许使用该方法)