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

Ale*_*lex 32 nginx ip redirect

我经营着一个相当大的图片库,有 5 位访问者每天使用网络复印机下载整个网站,从而创造了巨大的流量。这些访问者似乎拥有静态 IP。我想要实现的是,这 5 个 IP 在访问该站点时立即被重定向到某个页面(这解释了为什么它们的行为有问题)。所有其他访问者都应该能够正常浏览网站。

服务器运行 CentOS (5.8) 和 nginx (1.0.15) 作为网络服务器。有没有办法通过您知道的 nginx.conf 中的条目来实现这一点?

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

亲切的问候-亚历克斯

kol*_*ack 46

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

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 22

使用HttpAccessModule可以快速实现这一点。

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

  • 这实际上使用了 [Rewrite 模块](http://wiki.nginx.org/HttpRewriteModule)。您可以使用这样的正则表达式匹配:`if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$")`。 (2认同)

Don*_*nga 5

如果您重定向到同一域中的不同页面,并且按照上面的示例操作,则会导致重定向循环。所以在你的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 $uri $uri/ /index.php$is_args$args;
 }

location /warning-page/
{
try_files $uri $uri/ /index.php$is_args$args;
}
  
}
Run Code Online (Sandbox Code Playgroud)

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