web-dev-qa-db-ja.com

Nginx、特定のドメインから別のログファイルへのログリファラー

私は次のように特定のリファラーをブロックするようにnginxを設定しています:

if ($http_referer ~* (site_name) ) {
  return 403;
}

これは正常に機能しますが、ブロックされたリファラーを別のファイルに記録したいと思います。

追加してみました

 access_log /path/to/server/bad_domain.log;

ifステートメント内。ただし、これは機能しません。

何か案は?

ありがとう。

編集:

私もこれを無駄に試しました。

if ($http_referer ~* (site_name) ) {
  set $crawler 'yes';
  return 403;


}

location ~ .* {
  if ($crawler = 'yes') {
  access_log /path/to/server/bad_domain.log;
    }
}

編集2:

やってみる

map $http_referer $log_referer {
  domain1.com  1;
  default      0;
}

server { ..
    if ($http_referer = "1") {
    set $log_referer 1;
}
   access_log /path/to/logs/bad_domain.log if=$log_referer;

...}

の出力をくれます

nginx: [emerg] unknown log format "if=$log_referer"
3
Jone Does

here および here で見つかったnginxのドキュメントによると、マップルールを使用してhttpリファラーを特定の値にマップし、その値に従って特定のファイルにログを記録してみてください。このマップをhttpコンテキスト(サーバーコンテキストの外)に配置します。

map $http_referer $log_referer {
  example.com  1;
  default      0;
}

これはあなたのサーバー、場所などに行きます。

access_log /path/to/bad_domain.log combined if=$log_referer;
1
BackSlash

2回目の試行[編集2]の構文は正しいですが、古いバージョンのNGINXを使用しているためにエラーが発生すると思います。アクセスログの「if」はNGINX 1.7で導入されました。 リリースノート を参照してください。

UbuntuリポジトリからNGINXをインストールした場合は、バージョン1.4.xで出荷されます。 -Vを指定してnginxを実行し、実行しているバージョンを確認します。

$ nginx -V                                                                                         
nginx version: nginx/1.8.0   

次のbashフィドルでNGINX構成をセットアップしました:

https://thinapps.org/fiddle/lwcorkai27030iawscqklwonderquest

見てください! NGINXの最新バージョンをプルし、条件付きロギングを操作する方法を知るため。

1
Rkade

私は同じ問題に直面し、access_logにcombinedを追加することで解決しました

access_log /path/to/logs/bad_domain.log combined if=$log_referer;
0
nevertheless