提交表单时页面突然跳出 405 not allowed,或者用 curl 调接口直接返回一行 Method Not Allowed,很多人第一反应是网址写错了。其实网址没错,错的是请求方法:服务器认识这个地址,但不接受你用的提交方式。前端联调时尤其典型,昨天还能提交,今天突然全挂,八成是有人动了网关或服务器配置。
405 属于哪一类状态码
HTTP 状态码 4 开头都是客户端侧的问题。404 是地址不存在,405 是地址存在但方法不对。顺带分清 405 和 403:403 是权限不够,换什么方法都没用;405 换对方法就能通。还有个 501,表示服务器压根没实现这个方法,比 405 更彻底,遇到得查服务端模块。
四个常见原因
- 请求方法用反了:接口文档写的是 POST,代码里用了 GET,或者反过来。
- Nginx 托管纯静态页面:静态文件默认不处理 POST,表单一提交就报 405 not allowed。
- 服务器或网关出于安全考虑禁用了 PUT、DELETE、TRACE 这类方法。
- CDN 或 WAF 的防护规则拦截了非 GET 请求,直接回个 405。
排查按这个顺序来
第一步用 curl -I 加地址看响应头,重点看 Allow 字段列出了哪些方法。第二步按提示换方法再试:curl -X POST 加参数和地址。第三步查后端路由表,确认这个路径注册的是什么方法。第四步看 Nginx 和 Apache 配置里有没有 Limit、limit_except 这类方法白名单指令。第五步查 CDN 和 WAF 的拦截日志,不少 405 是它们给的。本地也可以用 Postman 复现一遍,看完整响应头。
Nginx 静态站点的特例
把表单请求交给后端程序处理是正规解法。如果只想让静态页不报错,有人会在 Nginx 里加一行 error_page 405 =200 $uri;,让 405 变成 200 返回,这只在个别场景有效,表单数据照样不会被处理,别当万能药。改完配置先跑 nginx -t 检查语法,再 reload 生效。
最后一句判断:405 几乎都是请求方法和服务端约定不一致,先对文档核对方法,再查服务器配置,九成问题在前两步就能定位。