リファラーの束を一度にブロックするエレガントな方法はありますか?


21

リファラースパムを防ぐために、nginx.confには次のようなセクションが含まれています。

if ($http_referer ~* spamdomain1\.com) {
    return 444;
}
if ($http_referer ~* spamdomain2\.com) {
    return 444;
}
if ($http_referer ~* spamdomain3\.com) {
    return 444;
}

これらのルールは、ユーザーがこれらのリファラーのいずれかを設定している場合に接続を閉じるようにnginxに指示します。これを行うよりエレガントな方法はありますか?これらのドメインのリストを定義して、「リファラーがこのリストにある場合は444を返す」などのように言うことはできますか?


サンプルのものと非常に似た大きなファイルを1つ作成し、必要に応じてインクルードファイルとして使用します。
フルボイェショポルヤル14年

回答:


31

私は試してみますmap

map $http_referer $bad_referer {
    default                  0;
    "~spamdomain1.com"       1;
    "~spamdomain2.com"       1;
    "~spamdomain3.com"       1;
}

その後、次のように使用します。

if ($bad_referer) {
    return 444;
}

1
mapはハッシュテーブルを使用するため、このアプローチは一連の個々のチェックよりも優れたパフォーマンスを発揮します。使用できるオプションについては、ドキュメントを読んでください。たとえば、リストされている別のファイルを使用すると、保守が容易にhostnamesなる可能性includeがあります。
ブライアン14年

mapOPは~*演算子を使用して正規表現のマッチングを行っており、実際に単純にマップルールを指定するので、特定のリファラーと一致する正規表現を使用できるかどうかに関連するドキュメントを読んで興味"~*spamdomain4.com" 1;がありました。きちんとした!
フルボイェショポルヤル14年

あなたは正しいです、とにかくこれを使用する必要があります。
マイケルハンプトン

hostnamesオプションを使用すると、単純になります.spamdomain4.com 1;
ブライアン14年

4
@Brian refererフィールドは完全なURLであり、単なるホスト名ではありません。だからそれは機能しません。
マイケルハンプトン

13

logical ORを使用して、1つのマルチマッチステートメントを作成できます。

if ($http_referer ~ "spamdomain1\.com|spamdomain2\.com|spamdomain3\.com")  { 
  return 444;
}

コメントごとの編集break;ブロックから削除する


2
returnが現在のリクエストの処理を停止するため、breakディレクティブに到達することはありません。
ザビエルルーカス14年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.