Nginx的geo指令

Nginx的geo指令

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

geo 指令其实是用来创建变量的,变量的值默认取决于 $remote_addr(也可手动设定使用其它变量),它的使用其实类似于 【map 指令】,建议先点进去看一下 map 指令的使用哦~~

下面是 geo 指令的使用规则:

语法: geo [$address] $variable { ... }
默认值: —
可使用的上下文: http

先说一下该指令的三个参数:

  • 第一个参数 $address 可省略,默认使用 $remote_addr,这里我们暂且称它为源变量;
  • 第二个参数为要创建的变量,这里我们暂且称它为结果变量;
  • 第三个参数为一个语句块,该语句块中可定义两列、多行,每行的第一列通常用来指定地址或地址段,我们这里暂且称它们为源值,每行的第二列用来定义一个结果值;

它们组合起来的作用就是:当请求到达 Nginx,geo 指令会让第一个参数源变量(默认就是 $remote_addr)值与第三个参数的每行的第一列进行匹配,如果匹配成功,则返回该行对应的结果值并将其赋值给结果变量。

是吧,是不是和 map 指令差不多~~

源值的可选格式如下:

  • IP 地址,如 127.0.0.1
  • IP 地址段,如 172.16.1.1-172.16.1.200
  • IP/MASK 的网络地址,如 172.16.1.0/24

除此之外,源值位还可定义如下特殊内部指令:

  • delete:删除指定的网络;
  • default:如果客户端地址不能匹配任意一个定义的地址,Nginx 将使用此值。 如果使用 CIDR,可以用 0.0.0.0/0 代替default
  • include:包含一个定义地址和值的文件,可以包含多个;
  • proxy:定义可信地址。 如果请求来自可信地址,Nginx 将使用其 X-Forwarded-For 头来获得地址。 相对于普通地址,可信地址是顺序检测的;
  • proxy_recursive:开启递归查找地址。如果关闭递归查找,在客户端地址与某个可信地址匹配时,Nginx 将使用 X-Forwarded-For 中的最后一个地址来代替原始客户端地址。如果开启递归查找,在客户端地址与某个可信地址匹配时,Nginx 将使用 X-Forwarded-For 中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址;
  • ranges:使用以地址段的形式定义地址,这个参数必须放在首位。为了加速装载地址库,地址应按升序定义;

还是整个 Demo 吧,配置虚拟主机如下:

geo $name {
    default 'unknown name';
    10.0.1.201 'Web 主机';
}

server {
    listen 80;
    default_type text/html;
    charset utf8;

    return 200 $name;
}

说明:当请求到达 Nginx 时,geo 指令会使用 $remote_addr 与所有源值进行匹配,如果请求的源地址为 10.0.1.201,则将对应的结果值 Web 主机 参数赋值给 $name,否则则将默认值 unknown name 赋值给 $name

下面验证一下啦~~

我先使用地址为 10.0.1.202 的主机访问:

$ curl '10.0.1.200?name=zze&job=student'
unknown name

再使用地址为 10.0.1.201 主机访问:

$ curl 10.0.1.200
Web 主机

easy 吧~

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/nginx-directive-geo.html

Buy me a cup of coffee ☕.