405 Not Allowed 怎么解决?Nginx、IIS、后端框架的分层排查与配置修复
“405 not allowed”是开发者与站长都会撞见的 HTTP 状态码,官方语义很明确:405 Method Not Allowed——服务器认识这个 URL,但不接受你使用的请求方法。它和 404(资源不存在)、403(禁止访问)性质完全不同,所以排查方向也不同。本文按 Nginx、IIS、后端框架三类环境,给出可对照的错误原因与修复配置。

一、先理解 405 的产生逻辑
HTTP 方法有 GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH 等。服务器对某资源逐一声明“允许哪些方法”,方法不在白名单里就返回 405,并应同时带上 Allow 响应头告知允许的方法。看到 405,第一反应应该是:请求方法与服务端策略不匹配,而不是路径写错。
二、Nginx 环境最常见的四种情形
2.1 POST 提交到静态文件
表单或接口把请求发到了 .html/.css/图片 这类静态资源上,Nginx 静态模块只接受 GET/HEAD,直接 405。典型是 rewrite 配置没生效,请求没有转发给 PHP。检查点:
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
try_files 兜底到 index.php 是 Laravel/ThinkPHP 等单入口框架的标准配法。
2.2 WebDAV 上传被拒
需要 PUT/DELETE 时要显式开启并放行方法:dav_methods PUT DELETE MKCOL COPY MOVE;,同时配置 dav_access,未开启的服务器对 PUT 一律 405。
2.3 反向代理/网关拦截
Nginx 本身允许方法,但上游(如只注册了 GET 路由的 API 网关、CDN 节点)返回 405。用 curl -X POST -v 地址 直连源站对比,即可分清是代理层还是源站。
2.4 安全模块限制
ModSecurity 之类 WAF 规则会拦非白名单方法并回 405/403。临时放行规则或改标准方法验证。
三、IIS 环境的典型问题
- WebDAV 模块冲突:装了 WebDAV 发布规则时,PUT 会被它接管并返回 405。不需要同步目录就在功能里关闭 WebDAV,或在
web.config中移除WebDAVModule与对应 handler。 - 处理程序映射缺方法:进入“处理程序映射”选中对应扩展(如
*.svc、.php)→ 请求限制,勾选所需的 GET/PUT/POST。 web.config示例(.NET 页面允许 PUT):
<system.webServer>
<handlers>
<remove name="WebDAV" />
</handlers>
<modules>
<remove name="WebDAVModule" />
</modules>
</system.webServer>
四、后端框架里自己造成的 405
- 路由方法没注册:ThinkPHP/Laravel/Spring 的路由绑定了 GET,前端却 POST,框架直接抛 405。ThinkPHP 里
Route::post('user/save', ...)与Route::rule('x', ...)->method('POST')要对齐;Spring 则是@GetMapping与@PostMapping用错。 - WordPress 的 REST/CPT 路由:自定义文章类型未声明
'show_in_rest' => true或注册了错误的 methods,POST 到/wp-json/wp/v2/xxx会 405;主题 functions.php 修正注册参数即可。 - CORS 预检失败:OPTIONS 请求没被框架处理,浏览器在预检阶段报“method not allowed”。需要网关显式响应 OPTIONS 并带
Access-Control-Allow-Methods。
五、五步定位流程(通用)
- 看响应头里有没有
Allow:,直接告诉你服务端接受什么方法。 - 把 405 响应的 HTML/JSON body 完整看一遍——框架级 405(如 TP/Spring)常带框架签名,静态层 405 则通常是 nginx 默认页。
- 用 curl 绕开前端直连:分别测 GET 与 POST,对比“直连源站”与“过 CDN/代理”的结果,把责任层定位出来。
- 查中间件:CDN、WAF、SLB、云函数的方法策略是否只放行 GET。
- 改完配置记得
nginx -s reload/应用重启,并清 CDN 缓存再测。
六、常见问题 FAQ
问:浏览器刷新页面报 405 但接口正常?
答:多半是表单重复提交或把刷新动作映射到了 POST 处理地址,历史 GET 页面被缓存策略改到 POST 路由上,检查 302/303 跳转逻辑。
问:移动端上传大文件 405?
答:先看是否触发了服务器体积限制组合错(部分实现会以 405/413 混报),确认 client_max_body_size 与 post_max_size、upload_max_filesize 三处一致。
一句话方法论:405 = 方法不匹配,不是路径错误。先用 Allow 头和 curl 分层定位(前端 → 代理/CDN → Web 服务器 → 框架路由),再对着本文各环境的配置去改,基本十分钟能定位到层。
生产内容,同时打通搜索引擎(SEO)与AI搜索引擎(GEO)流量入口的软件! 点击进入365建站器 »
