Nginx - Cara mengarahkan ulang pengguna dengan IP tertentu ke halaman khusus

26

Saya menjalankan galeri gambar yang cukup besar dan ada 5 pengunjung yang menghasilkan traffic yang sangat besar dengan mengunduh seluruh situs setiap hari menggunakan mesin fotokopi web. Para pengunjung itu memiliki IP statis seperti yang terlihat. Apa yang ingin saya capai adalah bahwa 5 IP tersebut dialihkan ke halaman tertentu (yang menjelaskan mengapa perilaku mereka bermasalah) segera setelah mereka mengunjungi situs tersebut. Semua pengunjung lain harus dapat menelusuri situs secara normal.

Server menjalankan CentOS (5.8) dan nginx (1.0.15) sebagai server web. Apakah ada cara untuk mencapai ini dengan entri di nginx.conf yang Anda ketahui?

Terima kasih banyak sebelumnya atas saran dan dukungan Anda!

Salam -Alex

Alex
sumber

Jawaban:

34

The Geo modul dibuat untuk mencocokkan alamat klien. Anda dapat menggunakannya untuk menentukan variabel yang akan diuji seperti:

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

Ini lebih efisien daripada menjalankan regex terhadap $ remote_addr, dan lebih mudah dikelola.

kolbyjack
sumber
Terima kasih banyak - bekerja dengan baik menggunakan geo! Hanya satu hal: Itu hanya mengalihkan permintaan ke domain.com dan tidak mengarahkan permintaan seperti domain.com/file.ext atau domain.com/subdirectory/file.ext. Bagaimana saya mencapai ini? Sayangnya, saya cukup Regob Noob. :(
Alex
Di mana Anda meletakkan if? Bisakah Anda memberikan seluruh blok server? Setelah beberapa pemikiran lagi, menempatkan if langsung di server bukan ide terbaik, karena akan dievaluasi bahkan untuk permintaan ke /noscrape.html
kolbyjack
20

Menggunakan HttpAccessModule Anda akan membuat ini terjadi dengan cepat.

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}
Khaled
sumber
Terima kasih banyak, Khaled! Apakah ada cara untuk memasukkan beberapa IP ke dalam arahan itu?
Alex
Maaf, saya agak bingung (baru di sini) - Apakah Matt menjawab pertanyaan atau Khaled? Namun, terima kasih untuk kalian berdua! ;)
Alex
1
Ini sebenarnya menggunakan modul Rewrite . Anda dapat menggunakan pertandingan ekspresi reguler seperti ini: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven
My nginx -Vmengatakan bahwa tidak ada modul seperti itu, tetapi berfungsi. Mungkin sudah dibangun untuk saat ini.
user3132194
1

Jika Anda diarahkan ke halaman lain di domain yang sama, dan jika Anda mengikuti contoh di atas akan menyebabkan perulangan langsung. jadi di file konfigurasi nginx Anda, gunakan sebagai berikut (saya menganggap Anda menggunakan wordpress karena banyak digunakan)

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

}

Sekarang jika seseorang dari daftar hitam ip mengunjungi halaman apa pun kecuali halaman peringatan yang tidak terdaftar di situs, mereka akan diarahkan ke halaman peringatan. karena penulisan ulang ada di lokasi / blok, itu tidak akan menyebabkan pengalihan loop. Namun, jika itu di dalam blok server, maka itu akan menyebabkan pengalihan loop.

Don Dilanga
sumber