Назад | Перейти на главную страницу

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"

Ваша вторая попытка [Редактировать 2] имеет правильный синтаксис, но я думаю, что ошибка возникает из-за того, что вы используете старую версию NGINX. 'если'в журнале доступа был представлен в NGINX 1.7, см. примечания к выпуску.

Если вы установили NGINX из репозитория Ubuntu, они поставляются с версией 1.4.x. Запустите nginx с параметром -V, чтобы узнать, какую версию вы используете.

$ nginx -V                                                                                         
nginx version: nginx/1.8.0   

Я установил конфигурацию NGINX на следующей скрипке bash:

https://thinapps.org/fiddle/lwcorkai27030iawscqklwonderquest

Посмотри! чтобы узнать, как загрузить последнюю версию NGINX и работать с условным ведением журнала.

Согласно найденной документации nginx Вот и Вотпопробуйте использовать правило карты для сопоставления вашего http-ссылки с определенным значением, а затем войдите в конкретный файл в соответствии с этим значением. Поместите эту карту в свой http-контекст (вне контекста сервера):

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

Это относится к вашему серверу, местоположению и т. Д .;

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

Я столкнулся с той же проблемой и решил, добавив комбинированный в access_log

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