Nginx - Come reindirizzare gli utenti con un determinato IP su una pagina speciale


26

Gestisco una galleria di immagini abbastanza grande e ci sono 5 visitatori che creano un'enorme quantità di traffico scaricando l'intero sito ogni giorno utilizzando le fotocopiatrici. Quei visitatori hanno IP statici come sembra. Quello che vorrei ottenere è che quei 5 IP vengano reindirizzati a una determinata pagina (il che spiega perché il loro comportamento è problematico) non appena visitano il sito. Tutti gli altri visitatori dovrebbero essere in grado di navigare normalmente nel sito.

Il server esegue CentOS (5.8) e nginx (1.0.15) come server web. C'è un modo per ottenere questo risultato inserendo una voce in nginx.conf di cui sei a conoscenza?

Grazie mille in anticipo per i tuoi suggerimenti e supporto!

Cordiali saluti -Alex

Risposte:


34

Il modulo Geo è creato per abbinare gli indirizzi dei client. Puoi usarlo per definire una variabile da testare in questo modo:

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

Questo è più efficiente dell'esecuzione di una regex contro $ remote_addr e più facile da mantenere.


Grazie mille - funziona alla grande usando geo! Solo una cosa: reindirizza solo le richieste a domain.com e non le richieste dirette come domain.com/file.ext o domain.com/subdirectory/file.ext. Come posso raggiungere questo obiettivo? Sfortunatamente, sono abbastanza RegEx Noob. :(
Alex,

Dove hai messo l'if? Potete fornire l'intero blocco server? Dopo qualche altra riflessione, inserire if direttamente nel server non è la migliore idea, poiché verrà valutata anche per una richiesta in /noscrape.html
kolbyjack,

20

Usando HttpAccessModule lo farai accadere rapidamente.

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

Grazie mille, Khaled! C'è un modo per includere diversi IP in quella direttiva?
Alex,

Mi dispiace, sono un po 'confuso (nuovo qui) - Matt ha risposto alla domanda o Khaled? Tuttavia, grazie a entrambi! ;)
Alex,

1
Questo effettivamente utilizza il modulo Rewrite . È possibile utilizzare una corrispondenza espressione regolare in questo modo: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven

Il mio nginx -Vdice che non esiste un tale modulo, ma funziona. Forse è integrato per ora.
user3132194,

1

Se hai reindirizzato a una pagina diversa nello stesso dominio e se hai seguito gli esempi sopra, questo causerà un loop diretto. quindi nel tuo file di configurazione nginx, usa come segue (suppongo che tu usi wordpress in quanto è ampiamente usato)

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

}

Ora, se qualcuno dell'ip nella lista nera ha visitato qualsiasi pagina tranne la pagina di avviso non elencata nel sito, verrà reindirizzata alla pagina di avviso. poiché la riscrittura si trova nella posizione / blocco, non causerà un ciclo di reindirizzamento. Tuttavia, se si trova all'interno del blocco server, causerà un ciclo di reindirizzamento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.