使用nginx重定向所有不是来自我的IP的请求

时间:2013-08-01 11:38:34

标签: http redirect nginx

我希望所有未通过我的IP地址发出的nginx请求被重定向到/some-page。我目前正在使用这个nginx配置:

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

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

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

2 个答案:

答案 0 :(得分:3)

如果在if内创建此location /,请以这种方式创建单独的location /some-page,当URI为{{1时,if将不会执行}}

<小时/> 编辑:好的,让我解释一下我的理解,你告诉我,如果我是对的,

  1. 良好的IP(你的):服务页面
  2. 错误的IP(不是您的):重定向到/some-page
  3. 问题是,当错误的IP重定向到/some-page时,它仍会重定向到/some-page,因为它仍然是错误的IP,因此它会通过/some-page测试

    我的解决方案:从if区块移除/some-page位置:

    /

    当Bad IP转发到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 } 时,它不再执行/some-page条件,因此将结束无限重定向循环。

    <小时/> 第二次编辑:您可以在自己的nginx中设置权限,让我演示:

    if

答案 1 :(得分:1)

我最后通过对请求路径进行另一次if检查来解决问题。我知道nginx不支持嵌套的if语句,因此我搜索并找到this blog post,它提供了一种解决方法 - 使用要检查的每个语句更新变量,然后在最终语句中对其进行匹配。在我的情况下,我做了这个,有效:

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