将一个IP列入白名单,同时使用nginx阻止多个国家/地区?

时间:2017-09-07 23:44:01

标签: nginx

我试图将流量限制在少数几个国家/地区,但我还希望将单个IP地址列入白名单。这是我的conf文件:

    # restrict access by country
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allow_visit {
        default no;
        US Yes;
        GB Yes;
        IL Yes;
        CA Yes;
    }

    ##
    # Virtual Host Configs
    ##

    server { # simple reverse-proxy

        listen       80;
        server_name  xXmySiteXx;

        root /usr/share/nginx/html;
#       root /var/www/html;
        index index.php index.html index.htm;   

            if ($scheme != "https") {
                return 301 https://$host$request_uri;
            } # managed by Certbot

    # reject unauthorized countries
    if ($allow_visit = no) {
        return 403;
    }

我尝试添加以下内容:

if($remote_addr = ipInQuestion) {
    set $allow_visit = yes;
}

但是当我尝试重新加载nginx时,它失败了。我有什么想法,或者更好的方法吗?

编辑:

我从nginx得到的错误是:

  

nginx:[emerg]未知指令" if($ remote_addr"

2 个答案:

答案 0 :(得分:1)

你弄清楚了问题,但是你仍然可能会遇到来自set语句在if中的问题。

为了摆脱if中的设置,你最好的选择就是制作另一张地图:

map $remote_addr $real_allow_visit {
    default $allow_visit;
    ipInQuestion no;
}

答案 1 :(得分:0)

我知道这是不好的做法,但我能够使用if方法设置变量...我必须将我的代码的第二部分调整为:

if ($remote_addr = ipInQuestion) {
    set $allow_visit yes;
}

具体来说,我需要在if和之间添加空格(并从set语句中删除=。执行这些操作后,nginx会通过测试并重新加载。