最直接有效的方式是用 limit_except 严格限定 http 方法,如 limit_except get head post { deny all; },拒绝 put、delete 等非必需方法并返回 405;需支持 cors 时对 /api/ 单独放行 options 并拦截危险方法;高并发场景推荐用 map + if 提升性能。

最直接有效的方式是在 Nginx 的 server 或关键 location 块中,用 limit_except 指令明确只放行业务必需的方法,其余一律拒绝。不需要额外模块,原生配置即可生效。
推荐方案:用 limit_except 严格限定方法
这是最简洁、高效且语义清晰的做法,Nginx 官方推荐用于方法控制:
- 在
server{}或根location / {}中添加:
limit_except GET HEAD POST {
deny all;
}
- 该规则会拒绝
PUT、DELETE、TRACE、OPTIONS、CONNECT、PATCH等所有未列出的方法,返回405 Not Allowed - 若确定不需要
HEAD(比如纯前后端分离 API),可精简为limit_except GET POST { deny all; } - 注意:不要把它放在过于狭窄的子路径(如仅限
/api),应覆盖主入口,防止绕过
补充方案:针对特殊需求灵活处理 OPTIONS
当后端是 RESTful API 且需支持跨域(CORS)时,OPTIONS 预检请求必须放行。此时不宜全局禁用,建议分路径控制:
- 对普通页面仍用
limit_except封锁 - 对
/api/路径单独配置:
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|PUT|DELETE)$) {
return 405;
}
proxy_pass http://backend;
}
进阶方案:用 map + if 提升性能(高并发场景适用)
在 http{} 块顶部定义映射,避免重复正则匹配,适合流量大的站点:
- 先定义规则:
map $request_method $is_dangerous {
default 0;
TRACE 1;
TRACK 1;
PUT 1;
DELETE 1;
CONNECT 1;
}
- 再在
server{}或location{}中调用:
if ($is_dangerous) {
return 405;
}
- 相比裸写
if正则,map查表更快,更利于 Nginx 优化执行路径
验证与注意事项
配置完成后务必验证:
- 运行
nginx -t检查语法,再nginx -s reload生效 - 测试禁用方法:
curl -X TRACE https://your.site应返回405;curl -X OPTIONS https://your.site若已禁用也应同理 -
OPTIONS是否放开,取决于你的前端是否跨域及后端是否要求预检——不是所有站点都需要它 - 避免在
if中做复杂正则或嵌套判断,易出错且影响性能;优先用limit_except或map











