2

ブラックリストに登録されたURLのリストがあり、それらが特定のリクエストのhttp_refererであるかどうかを確認したいと思います。もしそうなら、私はクッキーを設定しようとしています。私は以下のコードでそれをやってみました:

    set $blackListUrls "www.somesite.com,www.anothersite.com,www.yetanother.com";
    location / {
            if($blackListUrls ~* $http_referer){...}

    } 

しかし、nginxのステートメントについてもっと読んでいる間、私はそれを使うべきではないように思えます。ステートメントifを使用せずに、上記で話していることをどのように行うことができますか?if

また、私はnginxの経験がないので、別の方法を見つけた場合は、これを確認する必要がありますので、遠慮なく指摘してください。

4

3 に答える 3

1

に基づいてCookieを追加する場合はReferer、次のように機能するはずです。

map $http_referer $setcookie {
    default                "";
    http://some.exact.url  "cookiename=cookievalue";
    ~*example\.com         "cookiename=cookievalue";
    ...
}

server {
    ...
    location / {
        add_header Set-Cookie $setcookie;
        ...
    }
}

$ http_referer変数(つまりRefererヘッダー)を$ setcookie変数にマップします。デフォルトでは空です(リファラーがマップにリストされている場合は空ではありません)。add_headerディレクティブは、$setcookie値でヘッダーを追加するために使用されますSet-Cookie。$ addcookieが空の文字列と評価された場合、ヘッダーは追加されません。

では、map正確な文字列または正規表現( "〜"または "〜*"プレフィックス付き)を使用できます。

ドキュメントについてはこちらをご覧ください:

nginxリファラーモジュールもご覧ください。ただし、ブラックリストではなく、リファラーのホワイトリストを作成するように設計されており、ブラックリストの場合はアプローチを使用mapする方が簡単です。

于 2012-10-14T00:19:18.623 に答える
0

http://wiki.nginx.org/IfIsEvilを注意深く読むと、次のことに気付くでしょう。

  1. サーバーブロックに直接ある場合はOKです
  2. 一方、ロケーションブロックにある場合は、returnまたはrewriteディレクティブのみを保持している場合を除き、保存されません。

したがって、以下を実行すると、実際には完全に保存されます。

server {
  location / {
    set blackListUrls "www.somesite.com,www.anothersite.com,www.yetanother.com";
    if($blackListUrls ~* $http_referer){return 403;}
  } 
} 

言い換えれば、すべてのifを取り除く必要はありません

于 2012-10-14T09:43:12.860 に答える
0

注意:リファラーモジュールnginxがあります。

于 2012-10-14T15:21:44.477 に答える