6

我希望将所有不是由我的 IP 地址发出的 nginx 请求重定向到/some-page. 我目前正在使用这个 nginx 配置:

    if ($remote_addr != 127.0.0.1) {
        rewrite ^ http://www.example.com/some-page;
    }

这对我有用,因为我没有被重定向,但是其他任何人都陷入了重定向循环,因为该块不检查请求是否为/some-page.

我怎样才能解决这个问题?我不确定如何检查请求路径。

4

2 回答 2

9

如果这if是在location /例如内部创建的,则以location /some-page这种方式创建一个单独的,if当 URI 为/some-page


编辑:好的,让我解释一下我的理解,你告诉我我是对还是错,

  1. 良好的 IP(您的):按原样提供页面
  2. 错误 IP(不是你的):重定向到/some-page

问题是,当Bad IP被重定向到/some-page它仍然会/some-page再次重定向到,因为它仍然是一个Bad IP,所以它通过了if测试

我的解决方案:从块中删除/some-page位置:/

location / {
    # bla bla
    if ($remote_addr != 127.0.0.1) {
        rewrite ^ http://www.example.com/some-page;
    }
    # rest of bla bla
}
location /some-page {
    try_files index.html index.php; # or whatever
}

当 Bad IP 被转发给/some-page它时,它将不再执行if条件,因此将结束无限重定向循环。


第二次编辑:您可以自行在 nginx 中设置权限,让我演示一下:

location / {
    error_page 403 = @badip
    allow 127.0.0.1;
    deny all;
    #rest of bla bla
}
location @badip {
    return 301 $scheme://example.com/some-page;
}
于 2013-08-01T14:46:07.933 回答
1

我最终通过再次if检查请求路径解决了这个问题。我知道 nginx 不支持嵌套if语句,所以我搜索并找到了这篇博文,它提供了一种解决方法——用你要检查的每个语句更新一个变量,然后在最终语句中匹配它。就我而言,我这样做了,它有效:

    if ($remote_addr != 127.0.0.1) {
      set $check O;
    }
    if ($request_uri != "/some-page") {
      set $check "${check}K";
    }
    if ($check = OK) {
        rewrite ^ http://www.example.com/some-page;
    }
于 2013-08-01T16:01:26.280 回答