Nginx - Як перенаправити користувачів з певним IP на спеціальну сторінку


26

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

Сервер працює під управлінням CentOS (5.8) і nginx (1.0.15) як веб-сервер. Чи є якийсь спосіб досягти цього шляхом запису в nginx.conf, про який ви знаєте?

Заздалегідь дякую за натяки та підтримку!

З повагою - Алекс

Відповіді:


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, і його легше підтримувати.


Дуже дякую - чудово працює за допомогою гео! Тільки одне: він перенаправляє запити до domain.com, а не прямі запити, такі як domain.com/file.ext або domain.com/subdirectory/file.ext. Як я цього досягти? На жаль, я досить RegEx Noob. :(
Олексій

Куди ти поставив, якщо? Чи можете ви надати весь блок сервера? Ще трохи задумавшись, розміщення if безпосередньо на сервері - не найкраща ідея, оскільки це буде оцінено навіть за запитом на /noscrape.html
kolbyjack,

20

Використовуючи HttpAccessModule, ви швидко зробите це.

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

Дуже дякую, Халед! Чи є спосіб включити декілька ІС до цієї директиви?
Олексій

Вибачте, я трохи розгублений (тут новий) - Чи відповів Метт на питання чи Халед? Однак, дякую обом! ;)
Олексій

1
Для цього фактично використовується модуль Переписати . Ви можете використовувати регулярний вираз , як це: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven

Мій nginx -Vкаже, що такого модуля немає, але він працює. Можливо, він зараз побудований.
користувач3132194

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 із чорного списку відвідав будь-яку сторінку, окрім попереджувальної сторінки, яка не міститься на сайті, вона буде переспрямована на сторінку попередження. оскільки перезапис знаходиться у розташуванні / блоці, це не спричинить цикл переадресації. Однак якщо він знаходиться всередині серверного блоку, то він спричинить цикл переспрямування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.