Nginx系列-9 set和变量和if指令

1.set和变量

1.1 set用法

nginx配置文件中可以使用变量提取公共部分的配置。

变量只有一种类型,即字符串。在声明和使用变量的地方都需要加上$前缀,变量一旦声明,在整个nginx配置文件中都生效。如下所示:

shell 复制代码
server {
    server_name localhost;
    listen 8001;
    
    set $seong ewen;
    location /query {
        return 200 "hello $seong world";
    }
}

测试结果如下所示:

shell 复制代码
[root@host44 conf]# curl http://localhost:8001/query
hello ewen world

#如果使用变量前没有定义,会抛出异常,如下所示:
nginx: [emerg] unknown "seong" variable

1.2 预置变量

Nginx中预置了很多可以直接使用的变量,以下对常用变量进行介绍。

说明:Nginx提供的变量相对于每个请求而言,即每个请求对应不同的副本,类似于平行空间。

python 复制代码
#1.url与协议相关
$request_uri 客户端请求URI, 带完整的参数
$uri 客户端请求URI, 不带任何参数
$request_method HTTP请求的方法名, 如 GET、POST等

#2.地址和端口相关
$remote_addr 客户端的地址
$remote_port 客户端的端口

$server_addr 服务器地址
$server_port 服务器端口
    
#3.请求头
$content_length 客户端请求头的Content-Length 字段
$content_type 表示客户端请求头的Content-Type 字段
$cookie_COOKIE 表示在客户端请求头的cookie 字段
$host 表示客户端请求头的Host字段

#4.请求参数相关
$args 客户端请求中的完整参数。 例如, 在请求/query?id=400&name=seong 中, $args表示字符串id=400&name=seong.
$arg_PARAMETER HTTP 请求中某个参数的值, 如/query?id=400&name=seong, 可以用$arg_name取得seong这个值
$query_string 请求URI中的参数,与$args相同,区别是只读

2.if指令

可以在server块或者location块中使用if指令。语法为:

shell 复制代码
if (condition) {

}

该指令用于检测条件是否符合,符合则执行大括号内指令。

说明: if指令不支持多个条件的"与"/或"处理, 不支持else和else if语法,不支持嵌套

condition中一般进行字符串的匹配以及文件是否存在等判断,以下对常见用法进行整理:

1\] = 表示字符串是否相等; \[2\] \~ 和 \~\* 表示字符串的正则表达式匹配,后者不区分大小写; \[3\] -f 文件是否存在;-d 目录是否存在;-e 文件或目录是否存在; 另外,可通过添加!进行逻辑取反。 案例如下: ```shell server { server_name remote44; listen 8001; set $seong ewen; location /query { if ($arg_name = "seong") { return 200 "hello $seong world"; } return 200 "hello world"; } } ``` 测试结果如下所示: ```shell [root@124 conf]# curl http://localhost:8001/query?name=seong hello ewen world [root@124 conf]# curl http://localhost:8001/query hello world ```

相关推荐
bkspiderx2 小时前
Nginx 屏蔽服务器名称与版本信息(源码级修改)
运维·服务器·nginx
野生柚子2 小时前
记录学习K8s 集群中OOM Killer的决策基准及执行流程
linux·运维
TLucas3 小时前
在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录
linux·运维·postgresql·centos
ZoeLandia4 小时前
nginx实战分析
运维·前端·nginx
菜菜子爱学习5 小时前
Nginx学习笔记(九)—— Nginx Rewrite深度解析
linux·运维·笔记·学习·nginx
迷之程序员5 小时前
服务器装两个cpu
运维·服务器
Mr_Xuhhh7 小时前
传输层协议 TCP(1)
运维·服务器·网络·c++·网络协议·tcp/ip·https
扶风呀8 小时前
具有熔断能力和活性探测的服务负载均衡解决方案
运维·负载均衡
the sun348 小时前
从内核数据结构的角度理解socket
linux·运维·服务器
GDAL9 小时前
Docker pull拉取镜像命令的入门教程
运维·docker·容器