405错误源于purge请求未匹配location或未启用该方法,需检查正则路径匹配、显式允许purge方法、确认cache_purge模块已编译并正确配置proxy_cache_purge指令。

返回 405 Method Not Allowed 表示 Nginx 明确拒绝了 PURGE 请求,不是配置没生效,而是请求根本没被路由到 purge 处理逻辑里。核心原因通常是 location 匹配失败或 HTTP 方法未放开。
检查 location 是否能正确匹配 PURGE 请求路径
确保 PURGE 请求的 URI 落在你定义的 purge location 块内。常见错误包括:
- location 写成
location /purge,但实际发的是PURGE /api/user—— 这类请求不会命中,必须用正则匹配路径主体,例如location ~ ^/purge(/.*)?$或更宽松的location ~ /purge - URI 中带查询参数(如
/purge/path?x=1),而正则未覆盖$args,建议统一用location ~ ^/purge(/.*)$并在 proxy_cache_purge 中使用$1 - 请求路径被其他更优先的 location(如
location /或location ~ \.php$)提前截断,PURGE 请求根本没机会进入 purge 块
确认该 location 显式允许 PURGE 方法
Nginx 默认只允许 GET、HEAD、POST 等常用方法。PURGE 是自定义方法,必须显式启用:
- 在 purge location 块中添加
limit_except GET HEAD { allow all; }不起作用 —— 它不放行 PURGE - 正确做法是加
limit_except GET HEAD POST PUT DELETE { allow all; },或更精准地:limit_except GET HEAD { allow all; }仍不行,应直接写:if ($request_method !~ ^(GET|HEAD|PURGE)$ ) { return 405; },再配合proxy_cache_purge - 最稳妥方式:在 location 块内明确列出支持的方法,例如:
limit_except GET HEAD PURGE { deny all; }
验证 Nginx 是否加载了 cache_purge 模块且配置语法正确
即使 location 和 method 都对,模块缺失或配置错误也会导致降级为 405:
- 运行
nginx -V 2>&1 | grep -o 'cache_purge',无输出说明模块未编译进当前 nginx,PURGE 请求会被当作非法方法直接拒掉 - 检查
proxy_cache_purge指令是否写在 purge location 内,且参数格式正确:必须是proxy_cache_purge keys_zone_name cache_key(如mycache $1),缺一不可 - 若使用了
proxy_cache_bypass或proxy_no_cache等指令干扰缓存判断,也可能间接影响 purge 行为,建议临时注释排查
用 curl 模拟并观察实际匹配行为
别只看响应码,要确认请求到底进了哪个 location:
- 给所有 location 加临时日志,例如
access_log /var/log/nginx/purge.log main if=$is_purge;,配合set $is_purge "0";和if ($request_method = PURGE) { set $is_purge "1"; } - 用
curl -X PURGE -I http://yourdomain.com/purge/test查看响应头中的Server和自定义 header(如X-Location-Hit: purge),确认是否真进了 purge 块 - 开启
error_log /var/log/nginx/error.log debug;(需重新加载),搜索 “http request line” 和 “using configuration” 日志,可清晰看到匹配路径和最终选用的 location











