Nginx - Cómo redirigir a los usuarios con cierta IP a una página especial

26

Ejecuto una galería de imágenes bastante grande y hay 5 visitantes que crean una enorme cantidad de tráfico descargando todo el sitio todos los días usando copiadoras web. Esos visitantes tienen IP estáticas como parece. Lo que me gustaría lograr es que esas 5 IP se redirijan a una determinada página (lo que explica por qué su comportamiento es problemático) tan pronto como visitan el sitio. Todos los demás visitantes deberían poder navegar por el sitio normalmente.

El servidor ejecuta CentOS (5.8) y nginx (1.0.15) como servidor web. ¿Hay alguna forma de lograr esto mediante una entrada en nginx.conf que conozca?

¡Muchas gracias de antemano por sus sugerencias y apoyo!

Saludos cordiales -Alex

Alex
fuente

Respuestas:

34

El módulo Geo está hecho para coincidir con las direcciones de los clientes. Puede usarlo para definir una variable para probar así:

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

Esto es más eficiente que ejecutar una expresión regular contra $ remote_addr, y es más fácil de mantener.

kolbyjack
fuente
Muchas gracias, ¡funciona muy bien con geo! Solo una cosa: solo redirige las solicitudes a domain.com y no las solicitudes directas como domain.com/file.ext o domain.com/subdirectory/file.ext. ¿Cómo logro esto? Desafortunadamente, soy un novato de RegEx. :(
Alex
¿Dónde pusiste el si? ¿Puedes proporcionar el bloque de servidor completo? Después de pensarlo un poco más, poner el if directamente en el servidor no es la mejor idea, ya que se evaluará incluso para una solicitud a /noscrape.html
kolbyjack
20

Usando HttpAccessModule hará que esto suceda rápidamente.

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}
Khaled
fuente
Muchas gracias Khaled! ¿Hay alguna manera de incluir varias IP en esa directiva?
Alex
Lo siento, estoy un poco confundido (nuevo aquí) - ¿Respondió Matt la pregunta o Khaled? Sin embargo, gracias a los dos! ;)
Alex
1
Esto realmente usa el módulo Rewrite . Puede utilizar una expresión regular como esto: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven
Mi nginx -Vdice que no existe tal módulo, pero funciona. Tal vez está incorporado por ahora.
user3132194
1

Si redirigió a una página diferente en el mismo dominio, y si siguió los ejemplos anteriores, provocará un bucle directo. así que en su archivo de configuración nginx, use lo siguiente (supongo que usa wordpress ya que es ampliamente utilizado)

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

}

Ahora, si alguien de la IP en la lista negra visitó cualquier página, excepto la página de advertencia que no está en la lista en el sitio, será redirigido a la página de advertencia. Dado que la reescritura está en la ubicación / bloque, no causará un bucle de redireccionamiento. Sin embargo, si está dentro del bloque del servidor, provocará un bucle de redireccionamiento.

Don Dilanga
fuente