NGinx 将 Retry-After 标头添加到仅 429 响应

Mik*_*ell 3 nginx

给定以下 NGinx 配置,我将如何更改它以向429 个响应发出 Retry-After 标头?

limit_req_zone $binary_remote_addr zone=ip:10m rate=5r/s;
limit_req_status 429;
limit_conn_status 429;

server {

    listen 80;

    location /api {

        limit_req zone=ip burst=12 nodelay;

        proxy_pass http://website;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*Ten 5

有一个变量$status保存响应状态值。您可以使用map指令定义另一个保存重试延迟的变量并使用add_header指令。

add_header Retry-After $retry_after always;
Run Code Online (Sandbox Code Playgroud)

add_header如果值(第二个参数)为空,则不会发送标头。我们需要always标志,否则它不会为 429 状态码设置标头。

完整示例:

limit_req_zone $binary_remote_addr zone=ip:10m rate=5r/s;
limit_req_status 429;
limit_conn_status 429;

map $status $retry_after {
    default '';
    429 '120';
}

server {
    listen 80;
    location /api {
        limit_req zone=ip burst=12 nodelay;
        proxy_pass http://website;
        add_header Retry-After $retry_after always;
    }
}
Run Code Online (Sandbox Code Playgroud)