Nginx - Como redirecionar usuários com determinado IP para uma página especial

26

Eu administro uma galeria de imagens bastante grande e há 5 visitantes que criam uma enorme quantidade de tráfego baixando o site inteiro todos os dias usando copiadoras. Esses visitantes têm IPs estáticos, ao que parece. O que eu gostaria de conseguir é que esses 5 IPs sejam redirecionados para uma determinada página (o que explica por que seu comportamento é problemático) assim que eles visitam o site. Todos os outros visitantes devem poder navegar no site normalmente.

O servidor está executando o CentOS (5.8) e o nginx (1.0.15) como servidor da web. Existe alguma maneira de conseguir isso com uma entrada no nginx.conf que você conhece?

Muito obrigado antecipadamente por suas dicas e apoio!

Atenciosamente -Alex

Alex
fonte

Respostas:

34

O módulo Geo é feito para corresponder aos endereços do cliente. Você pode usá-lo para definir uma variável para testar da seguinte forma:

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

Isso é mais eficiente do que executar uma regex no $ remote_addr e mais fácil de manter.

kolbyjack
fonte
Muito obrigado - funciona muito bem usando geo! Apenas uma coisa: ele redireciona apenas solicitações para domain.com e não solicitações diretas como domain.com/file.ext ou domain.com/subdirectory/file.ext. Como faço para conseguir isso? Infelizmente, eu sou bastante RegEx Noob. :(
Alex
Onde você colocou o if? Você pode fornecer todo o bloco do servidor? Depois de mais algum pensamento, colocando a se diretamente no servidor não é a melhor ideia, uma vez que serão avaliados até mesmo para um pedido para /noscrape.html
kolbyjack
20

Usando o HttpAccessModule, você fará isso acontecer rapidamente.

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}
Khaled
fonte
Muito obrigado, Khaled! Existe uma maneira de incluir vários IPs nessa diretiva?
18712 Alex
Desculpe, estou um pouco confuso (novo aqui) - Matt respondeu à pergunta ou Khaled? No entanto, obrigado a vocês dois! ;) #
28412 Alex
1
Na verdade, isso usa o módulo Rewrite . Você pode usar uma expressão regular como esta: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven
Meu nginx -Vdiz que não existe esse módulo, mas funciona. Talvez esteja embutido por enquanto.
precisa saber é o seguinte
1

Se você redirecionou para uma página diferente no mesmo domínio e se seguiu os exemplos acima, isso causará um loop direto. Portanto, no seu arquivo de configuração nginx, use o seguinte (presumo que você use o wordpress, pois é amplamente usado)

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

}

Agora, se alguém do ip da lista negra visitou alguma página, exceto a página de aviso que não está listada no site, ela será redirecionada para a página de aviso. como a reescrita está no local / bloco, não causa um loop de redirecionamento. No entanto, se estiver dentro do bloco do servidor, causará um loop de redirecionamento.

Don Dilanga
fonte