Nginx中如何设置limit_req限制内部重定向,避免递归重定向引发雪崩?
- 内容介绍
- 文章标签
- 相关推荐
本文共计719个文字,预计阅读时间需要3分钟。
请提供需要改写的伪原创开头内容,我将根据您的要求进行修改。
识别重定向行为的关键变量
内部重定向不会改变客户端 IP 或原始请求 URI,但会更新 $request_uri 和 $uri。更可靠的方式是利用 nginx 内置变量标记“重定向深度”:
-
$request_length:虽不直接反映次数,但异常长的请求头(如反复添加自定义 header)可作为辅助线索 -
$sent_http_location:仅在返回 301/302 时存在,无法用于拦截内部重定向(它不触发响应头发送) -
推荐做法:用
map构造自定义 key,例如:
map $request_uri $redirect_depth {
~^/api/.*\?redirect=1$ 1;
~^/api/.*\?redirect=2$ 2;
default 0;
}
再结合limit_req_zone $redirect_depth zone=redir_check:1m rate=1r/s,对深度 ≥2 的请求强制限速
用 limit_req 拦截高频内部跳转
真正起作用的是把“可能引发递归的路径”单独圈出,并施加极严限流。
本文共计719个文字,预计阅读时间需要3分钟。
请提供需要改写的伪原创开头内容,我将根据您的要求进行修改。
识别重定向行为的关键变量
内部重定向不会改变客户端 IP 或原始请求 URI,但会更新 $request_uri 和 $uri。更可靠的方式是利用 nginx 内置变量标记“重定向深度”:
-
$request_length:虽不直接反映次数,但异常长的请求头(如反复添加自定义 header)可作为辅助线索 -
$sent_http_location:仅在返回 301/302 时存在,无法用于拦截内部重定向(它不触发响应头发送) -
推荐做法:用
map构造自定义 key,例如:
map $request_uri $redirect_depth {
~^/api/.*\?redirect=1$ 1;
~^/api/.*\?redirect=2$ 2;
default 0;
}
再结合limit_req_zone $redirect_depth zone=redir_check:1m rate=1r/s,对深度 ≥2 的请求强制限速
用 limit_req 拦截高频内部跳转
真正起作用的是把“可能引发递归的路径”单独圈出,并施加极严限流。

