Nginx-如何将具有特定IP的用户重定向到特殊页面


26

我经营一个很大的图片库,每天有5位访客使用webcopiers下载整个网站,从而创造了巨大的流量。这些访问者似乎具有静态IP。我要实现的是,一旦这5个IP访问该网站,它们就会被重定向到某个页面(这说明了它们的行为有问题的原因)。所有其他访问者都应该能够正常浏览该站点。

该服务器正在运行CentOS(5.8)和Nginx(1.0.15)作为Web服务器。有什么方法可以通过您知道的nginx.conf中的条目来实现此目的?

预先非常感谢您的提示和支持!

亲切的问候-亚历克斯

Answers:


34

地理模块由相匹配的客户端地址。您可以使用它来定义一个变量进行测试,如下所示:

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

这比对$ remote_addr运行正则表达式更有效,并且更易于维护。


非常感谢-使用geo效果很好!只是一件事:它仅将请求重定向到domain.com,而不重定向请求,例如domain.com/file.ext或domain.com/subdirectory/file.ext。我该如何实现?不幸的是,我是一个RegEx Noob。:(
Alex

您将if放在哪里?您可以提供整个服务器块吗?经过一番思考之后,将if放在服务器中并不是最好的主意,因为即使对/noscrape.html的请求也会对其进行评估
kolbyjack 2012年

20

使用HttpAccessModule,您可以快速完成此操作。

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

非常感谢,哈立德!有没有办法在该指令中包含多个IP?
亚历克斯(Alex)

抱歉,我有些困惑(新消息在这里)-Matt回答了问题还是Khaled?但是,感谢你们俩!;)
Alex

1
这实际上使用了Rewrite模块。您可以像这样使用正则表达式匹配:if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$")
mgorven 2012年

nginx -V说没有这样的模块,但是可以工作。也许现在是内置的。
user3132194 2015年

1

如果您重定向到同一域中的其他页面,并且遵循上述示例,则将导致直接循环。因此,在您的nginx配置文件中,请按以下方式使用(我假设您使用的是wordpress,因为它已被广泛使用)

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

}

现在,如果列入黑名单的IP中的某人访问了除该站点中未列出的警告页面之外的任何页面,他们将被重定向到警告页面。由于重写位于位置/块中,因此不会导致重定向循环。但是,如果它在服务器块内部,则将导致重定向循环。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.