nginx 协议加固首选 limit_except 指令限制 http 方法,仅允许 get 和 post,拒绝其他方法并返回 405;可配合 add_header allow、map 白名单及 if 快速拦截,再结合隐藏版本、上传目录隔离和 modsecurity 形成纵深防御。

直接限制只允许 GET 和 POST 方法,是 Nginx 协议加固中最基础也最有效的手段之一。它能有效拦截 PUT、DELETE、TRACE、OPTIONS 等非必要方法,降低被滥用或探测的风险,无需额外模块即可实现。
用 limit_except 指令精准控制(推荐)
这是 Nginx 原生支持、语义清晰、配置安全的方式,适用于 location 块内,不依赖 if,避免潜在陷阱。
- 在需要保护的路径下使用,例如:location /api { limit_except GET POST { deny all; } }
- 该配置明确表示:除 GET 和 POST 外,其他所有方法一律拒绝(返回 405 Method Not Allowed)
- 支持嵌套 location,可对不同路径做差异化限制,比如 /upload 只允 POST,/static 只允 GET
- 建议搭配 add_header Allow "GET, POST";,让客户端明确知道允许的方法
用 if + $request_method 快速全局拦截
适合快速生效或需统一处理的场景,但要注意它只能放在 location 块中,且不能用于 rewrite 或 proxy_pass 后置逻辑。
- 典型写法:if ($request_method !~ ^(GET|POST)$) { return 403; }
- 返回 403 更严格(比 405 更少暴露服务端细节),适合对外暴露面较小的接口
- 注意正则末尾不要加空格,^(GET|POST)$ 是精确匹配,避免误放 HEAD、OPTIONS 等
- 若需兼容 HEAD(常用于健康检查或缓存探针),可改为 ^(GET|HEAD|POST)$
用 map + if 实现集中式白名单管理
适合多 location 共享同一套方法策略,便于统一维护和审计。
- 在 http 块中定义映射:map $request_method $is_allowed { default 0; GET 1; POST 1; }
- 在各 location 中复用:if ($is_allowed = 0) { return 405; }
- 后续增删允许方法只需改 map,不用遍历每个 location
- 配合 add_header Allow "GET, POST"; 可自动同步响应头
配套加固建议
单靠限制方法不够,需结合其他措施形成纵深防御:
- 关闭不必要的 server_tokens,隐藏 Nginx 版本信息
- 对上传目录单独配置,例如 location /uploads { limit_except GET { deny all; } },防止文件被非 GET 方式读取
- 若启用 ModSecurity,可叠加规则:SecRule REQUEST_METHOD "!^(?:GET|POST)$" "phase:1,id:2049,log,deny,t:none",作为第二道防线
- 定期检查 access log,关注 403/405 日志,确认是否有异常扫描行为











