nginx中禁用不安全http方法的首选方案是使用limit_except指令,如location / { limit_except get head post { deny all; } },可精准放行必需方法并返回405,语义清晰、性能优、符合规范。

在 Nginx 的 server 块中禁用不安全的 HTTP 方法,核心是只放行业务真正需要的方法(通常是 GET、HEAD、POST),对 PUT、DELETE、TRACE、TRACK、OPTIONS、CONNECT 等非必需或高危方法统一拦截。最稳妥、高效且官方推荐的方式是使用 limit_except 指令。
用 limit_except 严格限定允许的方法
这是首选方案,语义清晰、无需正则、性能好、符合 HTTP 规范,适合放在根 location / 中,覆盖所有未单独定义的路径,防止绕过:
- 在
server块内添加如下配置:
limit_except GET HEAD POST {
deny all;
}
proxy_pass http://backend;
}
- 该规则会自动拒绝除 GET、HEAD、POST 外的所有方法,返回标准的
405 Not Allowed - 若确定不需要 HEAD(如纯 API 前端不依赖缓存校验),可精简为
limit_except GET POST { deny all; } - 避免只在
/api或子路径下使用——应优先覆盖主入口,确保全局生效
为 API 路径单独处理 OPTIONS 请求
RESTful 接口需响应浏览器预检请求(CORS),不能全局禁用 OPTIONS。应在 /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";
return 204;
}
if ($request_method ~ ^(TRACE|TRACK|PUT|DELETE)$) {
return 405;
}
proxy_pass http://backend;
}
- 先响应 OPTIONS 并返回必要 CORS 头,再拦截明确高危方法
- 不依赖白名单逻辑,即使后续新增了其他方法(如 PATCH),也不会意外放行
全局统一拦截(适合简单站点)
若希望在 server 块顶层统一控制,可用 if + $request_method 判断,Nginx 官方确认该用法对 $request_method 是安全的:
- 配置示例:
return 405;
}
- 注意正则要精确匹配,开头加
^、结尾加$,避免误拦(例如GETX不会被误认为GET) - 返回
405符合规范;如需静默断连,可用return 444
高并发场景:用 map 提升性能
当 QPS 极高时,重复正则匹配可能带来开销。可在 http{} 块顶部定义映射,把方法判断提前计算好:
- 在
http{}块中添加:
default 1;
GET 0;
HEAD 0;
POST 0;
}
- 然后在
server或location中使用:
return 405;
}
- 这种方式将字符串匹配转为查表,显著降低 CPU 开销











