推荐使用 limit_except 限制 HTTP 方法,仅放行 GET、HEAD、POST;全局策略可用 if + return;API 接口需单独放行 OPTIONS 以支持 CORS,同时拦截 TRACE/TRACK 等高危方法。

直接在 server 块中禁用不需要的 HTTP 方法(如 DELETE、TRACE、PUT、OPTIONS、TRACK),最稳妥且推荐的方式是使用 limit_except 指令或 if + return 组合,同时注意兼容真实业务需求(比如 CORS 需要 OPTIONS)。以下是三种实用配置方式,按推荐度和适用场景排列:
用 limit_except 限制方法(推荐用于 location 级)
该方式语义清晰、性能好,适用于大多数静态资源或反向代理场景:
- 只允许 GET、HEAD、POST,其余方法一律拒绝
- 写在
location /内,不影响其他 location 的特殊逻辑 - 返回标准 405 状态码,符合 HTTP 规范
示例:
location / {
limit_except GET HEAD POST {
deny all;
}
proxy_pass http://backend;
}全局 if 判断(适合简单统一策略)
若需在整个 server 范围内统一拦截,可在 server 块顶层用 if 判断请求方法:
- 匹配非法方法后立即返回 405 或 444(静默关闭连接)
- 注意:Nginx 官方提醒
if在 location 外使用有局限性,但用于$request_method是安全且常见的 - 建议搭配正则精确匹配,避免误拦
示例(仅放行 GET/HEAD/POST):
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}为 API 接口单独放行 OPTIONS(兼顾 CORS)
若后端是 RESTful API,浏览器预检请求需要 OPTIONS,不能全局禁用。此时应分路径处理:
- 主站路径(如
/)严格限制方法 - API 路径(如
/api/)显式允许 OPTIONS,并返回必要 CORS 头 - 仍对 TRACE、TRACK 等高危方法做额外拦截
示例:
location / {
limit_except GET HEAD POST { deny all; }
}
location /api/ {
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "Authorization, Content-Type";
add_header Access-Control-Max-Age 1728000;
return 204;
}
if ($request_method ~ ^(TRACE|TRACK)$) {
return 405;
}
proxy_pass http://api_backend;
}配置完成后务必执行 nginx -t 校验语法,再 nginx -s reload 生效。可用 curl -X TRACE http://yourdomain.com 和 curl -X DELETE http://yourdomain.com 验证是否返回 405。










