Nginx反向代理中应过滤并丢弃非法HTTP方法(如TRACE、DELETE、PUT),推荐用limit_except限定允许方法,或用if+return 444全局拦截,配合default_server兜底,关键是以444静默关闭连接。

在 Nginx 反向代理中,不能“重写”非法 HTTP 方法(如 TRACE、DELETE、PUT),但可以高效、安全地**过滤并丢弃**它们——即在请求到达后端前就终止处理,返回明确响应或直接关闭连接。
用 limit_except 限定允许的方法(推荐)
这是最简洁、最安全的方式,适用于只允许常见方法(GET、HEAD、POST)的场景:
- 放在
location块内,仅对当前路径生效 - 未显式列出的方法(如
TRACE、OPTIONS、CONNECT)会自动返回405 Method Not Allowed - 不依赖变量判断,性能高,无 if 风险
示例配置:
location /api/ {limit_except GET HEAD POST {
deny all;
}
proxy_pass http://backend;
}
用 if + return 拦截特定高危方法(需谨慎)
适合需要单独控制某些方法(如强制禁用 TRACE 全局生效)或返回不同状态码的场景:
- 可放在
server或http块中,实现全局拦截 - 只用
$request_method单一变量是安全的,避免混用rewrite或多个条件 - 返回
444可静默关闭连接(不发任何响应),比405更彻底
示例配置:
if ($request_method = TRACE) {return 444;
}
if ($request_method = TRACK) {
return 444;
}
配合 default_server 拦截未匹配路径的非法方法
很多扫描器和僵尸工具会向根路径或任意路径发送非法方法。可结合兜底 server 提升防护覆盖面:
- 设置一个
default_server,监听所有未命中业务server_name的请求 - 在其中统一拒绝非标准方法,避免规则遗漏
- 与 Host 头校验、空 Host 拦截形成组合策略
示例:
server {listen 80 default_server;
server_name _;
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 444;
}
return 403;
}
补充:丢弃而非响应的细节要点
真正“丢弃”请求的关键不在拦截逻辑本身,而在响应行为:
-
return 444是 Nginx 特有指令,立即关闭 TCP 连接,不发任何字节,对扫描器最有效 - 避免用
return 302或自定义跳转,否则可能暴露内部路径或被利用 - 不要在
if中调用proxy_pass,确保拦截发生在代理转发之前 - 搭配
error_page 405 =444 /可将limit_except触发的 405 统一转为 444


















