【问题标题】:Redirecting all requests that aren't from my IP with nginx使用 nginx 重定向所有不是来自我的 IP 的请求
【发布时间】:2013-08-02 07:32:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: http redirect nginx


    【解决方案1】:

    如果这个if是在location /中创建的,例如,创建一个单独的location /some-page这样当URI是/some-pageif不会被执行


    编辑:好的,让我解释一下我的理解,你告诉我我是对还是错,
    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;
    }
    

    【讨论】:

    • 我不认为我理解你。我希望检查影响server 块中的每个请求。添加location /some-page 没有帮助。
    【解决方案2】:

    我最终通过另一个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;
        }
    

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多