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

журнал nginx, когда присутствует конкретный реферер

Поскольку кто-то крадет контент с нашего веб-сайта, мне нужно создать дополнительный файл журнала, который будет регистрироваться только в том случае, если http_referrer содержит определенный домен.

В настоящее время у меня есть это:

   if ($http_referer ~* (bad-domain.com)){
           return  500;
   }

Но вместо возврата 500 мне нужно вернуть нормальный ответ, но для регистрации запроса.

В access_log директива действительна внутри if, так что вы можете просто добавить туда один.

тем не мение, его присутствие отменяет любые появляющиеся выше он находится в иерархии, поэтому, если вы просто добавите одну запись, запрос будет не записываться в любой журнал доступа, который вы обычно ведете для этого сервера.

Чтобы обойти это, вы можете использовать два access_log директивы внутри if, один из которых повторяет обычный журнал доступа, а другой - для вашего специального журнала доступа (который также может использовать другой log_format если хотите).

Просто кладу access_log внутри если, не работает

тем не мение access_log только внутри если внутри расположение и из этой ветки мы можем увидеть обходной путь:

Отдельный файл журнала доступа Nginx только для определенных запросов

if ($http_referer ~* (bad-domain.com)){
  set $bad_domain 'yes';
}

location / {
  if ($bad_domain = 'yes') {
    access_log logs/bad_domain.log;
    return 200;
    }

    ...
}

Использовать map директива вроде этой

map $http_referer $loggable_referer {
    default           0;
    ~*bad-domain.com  1;
}
access_log /var/log/nginx/bad_domain.log combined if=$loggable_referer;