Nginx - Cách chuyển hướng người dùng với một số IP nhất định đến trang đặc biệt


26

Tôi điều hành một bộ sưu tập hình ảnh khá lớn và có 5 khách truy cập tạo ra một lưu lượng truy cập khổng lồ bằng cách tải xuống toàn bộ trang web mỗi ngày bằng cách sử dụng webcopiers. Những khách truy cập có IP tĩnh như nó có vẻ. Điều tôi muốn đạt được là 5 IP đó được chuyển hướng đến một trang nhất định (điều này giải thích tại sao hành vi của họ có vấn đề) ngay khi họ truy cập trang web. Tất cả khách truy cập khác sẽ có thể duyệt trang web bình thường.

Máy chủ đang chạy CentOS (5.8) và nginx (1.0.15) dưới dạng máy chủ web. Có cách nào để đạt được điều này bằng một mục trong nginx.conf mà bạn biết không?

Cảm ơn bạn rất nhiều trước cho gợi ý và hỗ trợ của bạn!

Trân trọng -Alex

Câu trả lời:


34

Các mô-đun Geo được thực hiện để phù hợp với địa chỉ khách hàng. Bạn có thể sử dụng nó để xác định một biến để kiểm tra như vậy:

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;
  }
}

Điều này hiệu quả hơn so với việc chạy regex với $ remote_addr và dễ bảo trì hơn.


Cảm ơn bạn rất nhiều - nó hoạt động tuyệt vời bằng cách sử dụng địa lý! Chỉ có một điều: Nó chỉ chuyển hướng các yêu cầu đến domain.com và không yêu cầu trực tiếp như domain.com/file.ext hoặc domain.com/subdirectory/file.ext. Làm thế nào để tôi đạt được điều này? Thật không may, tôi khá là một RegEx Noob. :(
Alex

Nơi mà bạn đã đặt nếu? Bạn có thể cung cấp toàn bộ khối máy chủ? Sau khi suy nghĩ thêm, đặt if trực tiếp vào máy chủ không phải là ý tưởng tốt nhất, vì nó sẽ được đánh giá ngay cả đối với yêu cầu /noscrape.html
kolbyjack

20

Sử dụng HttpAccessModule, bạn sẽ thực hiện việc này nhanh chóng.

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

Cảm ơn bạn rất nhiều, Khaled! Có cách nào để đưa một số IP vào chỉ thị đó không?
Alex

Xin lỗi, tôi hơi bối rối (mới ở đây) - Matt đã trả lời câu hỏi hay Khaled? Tuy nhiên, cảm ơn cả hai bạn! ;)
Alex

1
Điều này thực sự sử dụng mô-đun Rewrite . Bạn có thể sử dụng kết hợp biểu thức chính quy như thế này : if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven

My nginx -Vnói rằng không có một mô-đun như vậy, nhưng nó hoạt động. Có lẽ nó được dựng sẵn cho bây giờ.
dùng3132194

1

Nếu bạn chuyển hướng đến một trang khác trong cùng một tên miền và nếu bạn làm theo các ví dụ trên, điều đó sẽ dẫn đến một vòng lặp trực tiếp. vì vậy trong tệp cấu hình nginx của bạn, hãy sử dụng như sau (Tôi giả sử bạn sử dụng wordpress vì nó được sử dụng rộng rãi)

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;
}

}

Bây giờ nếu ai đó trong danh sách đen được truy cập vào bất kỳ trang nào ngoại trừ trang cảnh báo không được liệt kê trong trang web, họ sẽ được chuyển hướng đến trang cảnh báo. vì việc viết lại nằm trong vị trí / khối, nó sẽ không gây ra vòng lặp chuyển hướng. Tuy nhiên, nếu nó nằm trong khối máy chủ thì nó sẽ gây ra vòng lặp chuyển hướng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.