You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel+Inertia遇405错误但数据已更新,请求技术支持

嘿,这个问题挺有意思的——数据库都更新成功了,居然还蹦出405错误,确实让人困惑。我帮你拆解下原因,再给你解决办法:

问题根源

核心矛盾点在于:你的PUT请求确实成功触发了控制器的update方法(所以数据库数据更新了),但控制器返回的普通HTTP重定向,和Inertia的AJAX请求逻辑不兼容,导致后续触发了MethodNotAllowedHttpException。

当你用this.$inertia.put()发起请求时,这是一个AJAX请求。而你在控制器里返回redirect()->back(),Inertia会尝试跟随这个重定向发起新请求,但这里出了问题:要么是原页面的路由没注册GET方法(Inertia默认用GET跳转),要么是Inertia错误地沿用了原请求的PUT方法去访问不支持PUT的页面路由,最终触发了错误。

解决方案

你只需要调整控制器的返回逻辑,让它返回Inertia兼容的响应就行,有两种常用方式:

方式1:用Inertia专属重定向

直接用Inertia的redirect方法明确跳转,确保用GET请求访问目标页面:

use Inertia\Inertia;

public function update(AskQuestionRequest $request, Question $question) {
    $question->update($request->only(['title', 'body']));
    
    // 假设你有一个名为questions.show的GET路由用于展示问题详情
    return Inertia::redirect(route('questions.show', $question))
        ->with('successMsg', 'Your Question has been updated successfully');
}

方式2:返回当前页面的Inertia响应

如果你想留在当前页面,直接返回带成功消息的当前组件即可,不需要跳走:

public function update(AskQuestionRequest $request, Question $question) {
    $question->update($request->only(['title', 'body']));
    
    // back()在Inertia环境下会自动返回当前页面的AJAX响应
    return back()->with('successMsg', 'Your Question has been updated successfully');
}

注意:用这种方式的话,你得确保questions/{id}这个路径已经注册了GET路由,比如在web.php里加上:

// 展示单个问题的GET路由
Route::get('/questions/{question}', [QuestionsController::class, 'show'])->name('questions.show');
// 更新问题的PUT路由
Route::put('/questions/{question}', [QuestionsController::class, 'update'])->name('questions.update');

额外检查点

  • 确认web.php里的PUT路由路径和你Vue组件中请求的questions/${this.id}完全一致;
  • 检查浏览器控制台的网络请求,看看405错误是来自初始的PUT请求,还是后续的重定向请求——这能帮你更精准定位问题;
  • 确保Laravel的CSRF验证正常(Inertia会自动携带令牌,但万一配置错了也可能出问题)。

总结

你的业务逻辑完全没问题(不然数据库不会更新),只是响应处理不符合Inertia的AJAX请求规则,调整控制器的返回方式就能解决这个奇怪的405错误啦。

内容的提问来源于stack exchange,提问作者steven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:27:35