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

26

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

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

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

С уважением -Alex

Alex
источник

Ответы:

34

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

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, и проще в обслуживании.

kolbyjack
источник
Большое спасибо - он отлично работает с гео! Только одно: он только перенаправляет запросы на domain.com, а не на прямые запросы, такие как domain.com/file.ext или domain.com/subdirectory/file.ext. Как мне этого добиться? К сожалению, я довольно нуб Регекс. :(
Алекс
Где ты положил если? Можете ли вы предоставить весь блок сервера? После некоторых размышлений размещение if непосредственно на сервере - не лучшая идея, поскольку оно будет оценено даже для запроса в /noscrape.html
kolbyjack
20

Используя HttpAccessModule, вы сделаете это быстро.

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}
Халед
источник
Большое спасибо, Халед! Есть ли способ включить несколько IP-адресов в эту директиву?
Алекс
Извините, я немного растерялся (новенький) - Мэтт ответил на вопрос или Халед? Тем не менее, спасибо вам обоим! ;)
Алекс
1
Это на самом деле использует модуль Rewrite . Вы можете использовать регулярное выражение , как это: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven
Мой nginx -Vговорит, что такого модуля нет, но он работает. Может быть, он встроен на данный момент.
user3132194
1

Если вы перенаправили на другую страницу в том же домене и следовали приведенным выше примерам, это приведет к прямому циклу. поэтому в вашем файле конфигурации 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 $fullurl${request_uri}index.html $uri $uri/ /index.php$is_args$args;
 }

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

}

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

Дон Диланга
источник