nginx限制http方法最推荐用limit_except指令,需置于location块内,仅允许列出的方法(自动含head,options需显式添加),其余返回405;也可用if或map实现,但各有适用场景与注意事项。

Nginx 限制只允许特定 HTTP 方法(如仅 GET 和 POST),核心是关闭非必要动词,防止被用于探测、越权或攻击。最稳妥、原生、推荐的方式是用 limit_except 指令,它语义明确、无副作用、无需正则、不依赖 if。
用 limit_except 精准控制允许的方法
该指令必须写在 location 块内,表示“只允许列出的方法,其余一律拒绝并返回 405”。
它自动包含 HEAD(即使没写),但 OPTIONS 需显式添加(否则跨域预检会失败)。
例如,只允许 /api 下的 GET 和 POST:
location /api {
limit_except GET POST {
deny all;
}
add_header Allow "GET, POST";
# 后续 proxy_pass 或 fastcgi_pass 等处理逻辑
}
- ✅
GET /api/list→ 允许 - ✅
POST /api/create→ 允许 - ❌
PUT /api/update→ 返回405 Method Not Allowed - ❌
DELETE /api/123→ 同样返回405 - ❌
TRACE /api或CONNECT /api→ 被拦截
若需支持前端跨域写操作(如 Vue/React 发起 DELETE),就把 OPTIONS 加进去:
limit_except GET POST OPTIONS {
deny all;
}
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
用 if + $request_method 快速全局拦截(慎用)
适合临时封禁或统一策略,但只能放在 location 块里,且不能和 rewrite/proxy_pass 后置逻辑混用。
匹配必须精确,避免误放 HEAD 或 OPTIONS:
if ($request_method !~ ^(GET|POST)$) {
return 403;
}
- 返回
403比405更少暴露服务端细节,适合内网或可信接口 - 注意:
^(GET|POST)$末尾不能有空格,否则GET(带空格)可能绕过
用 map 实现集中式方法白名单
适合多 location 共享同一套规则,便于后期维护。在 http 块顶部定义:
map $request_method $is_valid_method {
default 0;
GET 1;
POST 1;
}
然后在各 location 中复用:
location /admin {
if ($is_valid_method = 0) {
return 405;
}
add_header Allow "GET, POST";
}
- 新增允许方法时,只需改
map,不用逐个修改location - 配合
add_header Allow可自动同步响应头,客户端能明确知道合法方法
别忘了配套加固
单靠限制方法不够,建议同步做这几件事:
- 关闭版本暴露:
server_tokens off; - 对上传目录单独限制,比如
/upload只允许POST,/uploads/.*静态资源只允许GET - 若启用了 ModSecurity,可加规则拦截
REQUEST_METHOD !^(GET|POST|HEAD|OPTIONS)$ - 查看 access log 中
403/405日志,确认是否有扫描行为(如大量PUT/DELETE请求)
不复杂但容易忽略。











