Nginx--变量的使用

原文网址:Nginx--变量的使用_IT利刃出鞘的博客-CSDN博客

简介

本文介绍Nginx中变量的用法。

概述

数据类型

在 Nginx 配置中,变量只能存放一种类型的值:字符串。

Nginx中以$开头的字符串为变量对象。我们可以通过标准 ngx_http_rewrite_module 模块的 set 配置指令对变量进行赋值操作。

变量作用域

  1. set 有两个含义: 创建变量,给变量赋值
  2. 创建变量是在加载配置时候
  3. 赋值变量是当请求处理上下文需要时触发
  4. 直接调用一个未被创建的变量,会导致配置无法启动
  5. 变量名是整个配置文件可见,但变量的值是基于每个独立请求的上下文
  6. set命令可以用在 http、server,location,if 配置上下文中
  7. 同一个上下文中,多次set同一个变量,使用配置中最后一个set值 (rewrite模块中return有额外影响)

在不同层级的标签中声明的变量性的可见性规则如下:

  • location标签中声明的变量中对这个location块可见
  • server标签中声明的变量对server块以及server块中的所有子块可见
  • http标签中声明的变量对http块以及http块中的所有子块可见

自定义变量

普通用法

配置 $foo=hello

复制代码
server {
    listen 8080;
    server_name  localhost;
    
    location /test {
        set $foo hello;
        echo "foo: $foo";
    }
}

输出

复制代码
[root@localhost html]# nginx -s reload
[root@localhost html]# curl localhost/test
foo:  hello

使用插值

当引用的变量名之后紧跟着变量名的构成字符时(比如后跟字母、数字以及下划线),需要使用特别的记法来消除歧义,例如:

复制代码
server {
    ...
    location /test-brace {
        set $first "hello ";
        echo "${first}world";
    }
}

输出

复制代码
[root@localhost html]# nginx -s reload
[root@localhost html]# curl localhost/test-brace
hello world

这里,我们在 echo 配置指令的参数值中引用变量 first 的时候,后面紧跟着 world 这个单词,所以如果直接写作 "firstworld" 则 Nginx "变量插值"计算引擎会将之识别为引用了变量 firstworld。为了解决这个难题,Nginx 的支持使用花括号在 之后把变量名围起来,比如这里的 ${first}。

输出 $ 符

如果我们想通过 echo 指令直接输出含有"美元符"()的字符串,那么有没有办法把特殊的 字符给转义掉呢?答案是:不能。幸运的是,我们可以绕过这个限制,比如通过不支持"变量插值"的模块配置指令专门构造出取值为 $ 的 Nginx 变量,然后再在 echo 中使用这个变量。看下面这个例子:

复制代码
http {
    ...
    geo $dollar {
        default "$";
    }
    server {
        ...
        
        location /test-dollar {
            echo "This is a dollar sign: $dollar";
        }
    }
}

输出

复制代码
[root@localhost html]# nginx -s reload
[root@localhost html]# curl localhost/test-dollar
This is a dollar sign: \$

这里用到了标准模块 ngx_geo 提供的配置指令 geo 来为变量 dollar 赋予字符串 "",这样我们在下面需要使用美元符的地方,就直接引用我们的 $dollar 变量就可以了。

内置变量

|---------------------|------------------------------------------------------------------------------------------------------------|
| 变量名 | 定义 |
| arg_PARAMETER | GET请求中变量名PARAMETER参数的值。 | | args | 这个变量等于GET请求中的参数。例如:foo=123&bar=blahblah; 这个变量只可以被修改 |
| binary_remote_addr | 二进制码形式的客户端地址。 | | body_bytes_sent | 传送页面的字节数 |
| content_length | 请求头中的Content-length字段。 | | content_type | 请求头中的Content-Type字段。 |
| cookie_COOKIE | cookie COOKIE的值。 | | document_root | 当前请求在root指令中指定的值。 |
| document_uri | 与uri相同。 |
| host | 请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值)。值为小写,不包含端口。 | | hostname | 机器名使用 gethostname系统调用的值 |
| http_HEADER | HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:http_user_agent(Uaer-Agent的值); |
| sent_http_HEADER | HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如: sent_http_cache_control, sent_http_content_type...; | | is_args | 如果args设置,值为"?",否则为""。 | | limit_rate | 这个变量可以限制连接速率。 |
| nginx_version | 当前运行的nginx版本号。 | | query_string | 与args相同。 | | remote_addr | 客户端的IP地址。 |
| remote_port | 客户端的端口。 | | remote_user | 已经经过Auth Basic Module验证的用户名。 |
| request_filename | 当前连接请求的文件路径,由root或alias指令与URI请求生成。 | | request_body | 这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。 |
| request_body_file | 客户端请求主体信息的临时文件名。 | | request_completion | 如果请求成功,设为"OK";如果请求未完成或者不是一系列请求中最后一部分则设为空。 |
| request_method | 这个变量是客户端请求的动作,通常为GET或POST。包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。 | | request_uri | 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看uri更改或重写URI。 | | scheme | 所用的协议,比如http或者是https,比如rewrite ^(.+) scheme://example.com1 redirect; | | server_addr | 服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。 |
| server_name | 服务器名称。 | | server_port | 请求到达服务器的端口号。 |
| server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 | | uri | 请求中的当前URI(不带请求参数,参数位于 args),不同于浏览器传递的request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html |

相关推荐
七夜zippoe7 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6488 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满8 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠9 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9039 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技10 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀10 小时前
Linux环境变量
linux·运维·服务器
zzzsde10 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º12 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~12 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化