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 吧~
评论区