nginx 301'ing limit_req 限制请求而不是错误页面

mog*_*smo 5 nginx proxy redirect 301-redirect rate-limiting

我在 nginx 后面的 apache 服务器上有一个批量搜索表单。我想保护该位置,以便 10 分钟内的第二个请求将 301 转到“您想使用我们的 API”页面,而不是类似以下内容:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
       location = /search/bulk {
                limit_req zone=one burst=2;
                 ...  SOME CONFIG HERE...
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

当他们达到我的 limit_req 而不是显示 ngnix 错误页面时,我将如何 301 最终客户端?此外,其次,我不想限制整个 http 条款的流量。我可以在没有速率的情况下设置 limit_req_zone,但将它们放在我的位置节中吗?

谢谢,

M。

kri*_*sFR 6

默认情况下,nginx将返回503 service temporarily unavailable错误代码。

limit_req_status指令的存在是为了更改错误代码,以防它们遇到limit_req

location = /search/bulk {
          limit_req zone=one burst=2;
          limit_req_status 404;
}
Run Code Online (Sandbox Code Playgroud)

问题是这个指令只允许从 400 到 599 的范围,所以你不能指定一个301

[emerg] 3130#0: value must be between 400 and 599 in /etc/nginx/nginx.conf:72
Run Code Online (Sandbox Code Playgroud)

因此,如果您的主要问题是显示自定义错误消息而不是默认错误消息,则503可以按如下方式进行:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
       location = /search/bulk {
                limit_req zone=one burst=2;
                error_page  503  /503.html;
       }
       location  /503.html {
            internal;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你的自定义503.html文件:

<html><body>Would you like to use our API ?</body></html>
Run Code Online (Sandbox Code Playgroud)

rate参数是强制性的。您必须指定一个费率limit_req_zone