Nginx 通过白名单+高危方法优先拦截限制非标准HTTP方法:先用 if 拦截 TRACE/TRACK 返回 444,再用 if 或 limit_except 白名单允许 GET/HEAD/POST/OPTIONS 等,禁用 deny 黑名单;辅以 Host 头校验和请求头缓冲限制。

在 nginx.conf 中限制非标准 HTTP 请求方法,核心是**不依赖轮询或代理逻辑,而是在 server 或 location 块中主动拦截非法方法**。Nginx 本身不校验方法合法性,必须显式配置规则,最稳妥的方式是“白名单 + 高危方法优先拦截”。
用 if + return 实现方法白名单
这是最直接、兼容性好、可精确控制响应码的方式。放在 server 块顶层或关键 location 内:
- 只允许业务实际需要的标准方法,例如 GET、HEAD、POST、OPTIONS(CORS 预检必需):
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$) { return 405; } - 若需支持 PATCH 或 PUT,必须显式加入正则,如
^(GET|HEAD|POST|PUT|PATCH|OPTIONS)$ - 避免用
deny PUT;这类黑名单写法——它无法拦截任意拼写的自定义方法(如 FOO、X-AUTH)
优先拦截 TRACE 和 TRACK 方法
这两个方法存在明确安全风险(如 XST 攻击),应比白名单更早处理,且用 444 彻底断连:
- 在白名单
if规则之前添加:if ($request_method ~ ^(TRACE|TRACK)$) { return 444; } -
444不返回任何响应体,比405更彻底,也防信息泄露 - 确保该规则位置靠前,否则可能被后续规则跳过
配合 Host 头与请求头校验增强防护
单靠方法限制不够,攻击常组合异常 Host 或畸形头部绕过:
- 拒绝含端口号的 Host(如
example.com:8080):if ($host ~ ":[0-9]+$") { return 400; } - 限制请求头缓冲区,防超长/畸形头部藏匿非法方法:
client_header_buffer_size 1k;<br>large_client_header_buffers 2 2k;
- 可选:检查 User-Agent 是否含扫描器特征(如
sqlmap、nuclei),命中即return 403
用 limit_except 替代 if(推荐用于简单场景)
更轻量、更安全,仅适用于 location 级别且规则固定的情况:
- 放在
location /或具体路径块内:limit_except GET HEAD POST { deny all; } - 效果:除列出的方法外,其余一律返回
405 Method Not Allowed - 注意:不能嵌套在
if中,也不能放在server块顶层,只能在location内使用


















