Nginx,将来自特定域的引用记录到单独的日志文件

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"

答案1

根据 nginx 文档发现这里这里,尝试使用映射规则将您的 http referer 映射到某个值,然后根据该值记录到特定文件。将此映射放入您的 http 上下文中(服务器上下文之外):

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

这将转到您的服务器、位置等;

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

答案2

第二次尝试[编辑2] 的语法正确,但我认为错误是由于您使用的是旧版本的 NGINX。'如果' 在 NGINX 1.7 中引入了访问日志,请参阅发行说明

如果你从 Ubuntu repo 安装了 NGINX,那么他们提供的是 1.4.x 版本。使用 -V 运行 nginx 可以知道你正在运行的是哪个版本。

$ nginx -V                                                                                         
nginx version: nginx/1.8.0   

我已经在以下 bash fiddle 中设置了 NGINX 配置:

https://thinapps.org/fiddle/lwcorkai27030iawscqklwonderquest

看一看!了解如何获取最新版本的 NGINX 并使用条件日志记录。

答案3

我遇到了同样的问题并通过添加解决了合并到 access_log

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

相关内容