前端把表单从 GET 改成 POST,浏览器 Network 面板立刻红了一行 405 method not allowed。接口地址没写错,参数也在,问题出在请求方法上。
405 的意思是服务器认识这个路径,但当前资源不接受这个 HTTP 方法。响应头里通常会带一个 Allow,列出它允许的方法,比如 GET、HEAD。先看这一行,方向就清楚一半。
先分清 404、403 和 405
404 是路径不存在,403 是路径存在但没权限,405 是方法不对。501 则是服务器根本不支持这个方法,跟 405 不是一回事。别看到红字就重写接口地址。
常见的四种来源
常见来源有四种:静态服务器默认只放行 GET 和 HEAD,后端路由只绑定了 GET,反向代理的 limit_except 挡了 PUT、DELETE,跨域预检 OPTIONS 被拒时浏览器也会显示 405。前两种改前端或补路由,后两种要动 Nginx 配置和 CORS 响应头。
按来源改,别乱试
静态资源要提交表单,就把表单方法改回 GET,或者换到后端接口。Nginx 放行方法可以写 limit_except GET POST { deny all; },需要 PUT 就一起加上。后端按框架补路由,Spring 用 @PostMapping,Express 用 app.post。
OPTIONS 返回 405 的,在路由里显式处理 OPTIONS,返回 204 并带上 Access-Control-Allow-Methods 和 Allow-Origin。用 curl -i -X POST 加接口地址,能看到完整的响应头,比在浏览器里猜快。
还查不出来就看服务端 access log,确认请求到底落在哪个 location 或哪个路由。中间隔着 CDN 或对象存储的,405 也可能是那一层回的,Allow 头能看出来。改完用同一条 curl 再打一次,顺手把 POST 和 GET 各打一次对比,别只看前端页面,405 method not allowed 属于很好查的一类错误,Allow 会直接告诉你答案。