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 ```

相关推荐
叽里咕噜怪8 小时前
Pod的详解与进阶
运维·容器·kubernetes
ONLYOFFICE8 小时前
入门指南:远程运行 ONLYOFFICE 协作空间 MCP 服务器
运维·服务器·github·onlyoffice
行初心8 小时前
uos基础 autostart 设置程序开机自启动
运维
Dovis(誓平步青云)8 小时前
《Linux 核心 IO 模型深析(中篇):探索Cmake与多路转接的高效实现poll》
linux·运维·服务器·数据库·csdn成长记录
韦东东8 小时前
行业资讯日报自动化:从采集到 LLM 生成的全链路拆解(以政务网站为例)
运维·人工智能·自动化·大模型·llm·政务·行业资讯
tianyuanwo8 小时前
TERM变量迷思:从Jenkins节点连接差异看终端仿真与构建系统的微妙关系
运维·ssh·jenkins·java web·term
一勺菠萝丶8 小时前
Jenkins 打包显示 SUCCESS 但产物不全?日志出现 Killed 的排查与解决(小白版)
运维·jenkins
tyatyatya8 小时前
Ansible自动化配置,从入门到实战
运维·自动化·ansible
Anakki8 小时前
企业级 Elastic Stack 集成架构:Spring Boot 3.x 与 Elasticsearch 8.x 深度实践指南
运维·jenkins·springboot·elastic search
DevOps-IT9 小时前
HTTP状态码(常见 HTTP Status Code 查询)
运维·服务器·网络·网络协议·http