web-dev-qa-db-ja.com

nginx 301'ing limit_reqは、エラーページの代わりにリクエストを制限します

Nginxの背後にあるApacheサーバーに一括検索フォームがあります。その場所を保護して、10分間の2番目のリクエストが代わりに「APIを使用しますか」ページに301で送信されるようにしたいと思います。

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...
       }
    }
}

Ngnixエラーページを表示する代わりに、エンドクライアントがlimit_reqに達したときに、どのように301しますか?また、第二に、http句全体にトラフィックを抑制したくありません。レートなしでlimit_req_zoneを設定できますが、ロケーションスタンザに設定できますか?

ありがとう、

M。

5
mogmismo

デフォルトでは、nginx503 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のレートを指定する必要があります

6
krisFR