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】:问题出在我发送的数据中。我不知道为什么,但我的服务器不喜欢整个项目数组,所以我更新了它以仅发送我想删除的 id
s 数组,因此将控制器更新为 @987654322 @请求。如果有人有解释,我很好奇。
【讨论】:
以上是关于AJAX 请求中不允许使用 Laravel 405 方法的主要内容,如果未能解决你的问题,请参考以下文章
405 方法不允许,PATCH 不工作。 Laravel、Ajax、Jquery、引导模式
当我使用 ajax 发布请求时,为啥在我的 live laravel 项目中显示 404 和 405