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

Nginx - Как перенаправить пользователей с определенным IP на специальную страницу

У меня довольно большая галерея изображений, и пять посетителей создают огромный трафик, загружая весь сайт каждый день с помощью веб-копиров. Кажется, у этих посетителей статические IP-адреса. Я хотел бы добиться, чтобы эти 5 IP-адресов перенаправлялись на определенную страницу (что объясняет, почему их поведение проблематично), как только они посещают сайт. Все остальные посетители должны иметь возможность просматривать сайт в обычном режиме.

Сервер работает под управлением CentOS (5.8) и nginx (1.0.15) в качестве веб-сервера. Есть ли способ добиться этого с помощью записи в nginx.conf, о которой вы знаете?

Заранее большое спасибо за ваши советы и поддержку!

С уважением - Алексей

В Гео модуль сделан под адреса клиентов. Вы можете использовать его для определения переменной для тестирования следующим образом:

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
  4.3.2.1/32 1;
}

server {
  if ($bad_user) {
    rewrite ^ http://www.example.com/noscrape.html;
  }
}

Это более эффективно, чем запуск регулярного выражения для $ remote_addr, и его проще поддерживать.

С помощью HttpAccessModule вы сделаете это быстро.

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}

Если вы перенаправили на другую страницу в том же домене, и если вы следовали приведенным выше примерам, это вызовет цикл перенаправления. поэтому в вашем файле конфигурации nginx используйте следующее (я предполагаю, что вы используете wordpress, поскольку он широко используется)

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
  4.3.2.1/32 1;
}

server {
 location /
 {
  if ($bad_user) {
    rewrite ^ http://www.example.com/warning-page/ break;
  }

try_files $uri $uri/ /index.php$is_args$args;
 }

location /warning-page/
{
try_files $uri $uri/ /index.php$is_args$args;
}
  
}

Теперь, если кто-то из IP-адресов из черного списка посетил любую страницу, кроме страницы с предупреждением, которая не указана на сайте, он будет перенаправлен на страницу с предупреждением. поскольку перезапись находится в местоположении / блоке, это не вызовет цикла перенаправления. Однако, если он находится внутри серверного блока, это вызовет цикл перенаправления.