我在 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...
}
}
}
当最终客户端达到我的 limit_req 时,我该如何 301 重定向而不是显示 ngnix 错误页面?另外,其次,我不想限制整个 http 子句的流量。我可以设置不带速率的 limit_req_zone,但将它们放在我的位置节中吗?
谢谢,
M.
答案1
默认情况下,nginx
将返回503 service temporarily unavailable
错误代码。
该limit_req_status
指令用于在遇到以下情况时更改错误代码limit_req
:
location = /search/bulk {
limit_req zone=one burst=2;
limit_req_status 404;
}
问题是该指令仅允许从 400 到 599 的范围,因此您无法指定301
:
[emerg] 3130#0: value must be between 400 and 599 in /etc/nginx/nginx.conf:72
因此,如果您的主要问题是显示自定义错误消息而不是默认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;
}
}
}
然后您的自定义503.html
文件:
<html><body>Would you like to use our API ?</body></html>
此rate
参数是必需的。您必须指定一个速率limit_req_zone