nginx变量
nginx变量命名,以$开头。
举例:'nginx.conf 文件'中有下面这一行配置:
set $var "hello world";
特点:我们看到,'Nginx 变量名'前面'有一个 $ 符号',这是'语法上'的要求
强调:所有的 'Nginx 变量'在 Nginx 配置文件中'引用时都须带上 $ 前缀',这种表示方法和'Perl、PHP' 这些语言是'相似'的
变量赋值
举例:'nginx.conf 文件'中有下面这一行配置:
set $var "hello world";
特点:我们看到,'Nginx 变量名'前面'有一个 $ 符号',这是'语法上'的要求
强调:所有的 'Nginx 变量'在 Nginx 配置文件中'引用时都须带上 $ 前缀',这种表示方法和'Perl、PHP' 这些语言是'相似'的
打印日志(打印变量)
打印日志的目的,是想知道某个变量的值是多少,通过add_header设置响应头,间接地打印日志。
通过设置响应头,然后在浏览器上请求nginx地址,然后得到的响应头,就知道变量值是多少了。
location / {
proxy_pass http://127.0.0.1:8085;
add_header mmm "123";
set $test "456";
add_header nnn $test;
}
}
Nginx特有的语法
这个需要注意一下,特别是正则 ~ ,后面截取字符串需要用到。
模式 | 含义 |
= | = 表示精确匹配 |
^~ | ^ 进行前缀匹配,~ 表示区分大小写 |
~ | ~ 区分大小写的正则匹配 |
~* | ~* 不区分大小写的正则匹配 |
!~ | 区分大小写不匹配 |
!~* | 不区分大小写不匹配 |
Nginx变量截取字符串,拼接字符串
同样是间接的方式,核心思想,使用正则()匹配,然后使用$1、$2、$3...取值。
比如有个字符串,A123B789C,使用正则表达式,A(\d+)B(\d+)C,然后就可以使用$1取值为123,$2取值为789
location / {
proxy_pass http://127.0.0.1:8085;
#定义一个变量$myname,为空字符
set $myname "";
#定义一个变量为测试字符串
set $user "A123B789C";
#使用正则匹配
if ( $user ~ A(\d+)B(\d+)C ) {
# set $mmm $1;
# set $nnn $2;
#字符串的连接直接挨着就行了,不需要连接符。
set $myname $1$2;
}
#间接打印日志,前台ccc 响应头的值为:123789
add_header ccc $myname;
}
这里需要注意,基础的正则表达式语法都是通用的。比如,+表示1个或者多个,*表示0个或者多个,.表示任意字符,\d表示数字。
获取请求头的参数
须要在header名称前面加上固定前缀“http_“,并将header名称中的“-”中划线变为下划线
请求头取值如下:
location / {
proxy_pass http://127.0.0.1:8085;
add_header aaa $http_Pragma;
add_header bbb $http_Cache_Control;
}
添加修改HTTP请求头
location / {
proxy_pass http://127.0.0.1:8085;
proxy_set_header User-Agent "My Custom User Agent";
proxy_set_header kk "123";
}
添加修改HTTP响应头
location / {
add_header X-Custom-Header "Hello, World!";
add_header X-Powered-By Nginx;
add_header Cache-Control no-store;
}
删除HTTP响应头
location / {
proxy_pass http://backend;
proxy_hide_header X-Powered-By;
}
内置变量
$remote_addr;
存放了'客户端的地址',注意是客户端的公网IP,也就是一家人访问一个网站,则会显示为'路由器的公网IP'
$args;
变量中存放了'请求行中(GET请求)的参数',例如http://node101.yinzhengjie.org.cn/main/index.do?'id=20190221&partner=search'中的id=20190221&partner=search
$document_root;
保存了针对'当前资源的请求'的'系统根目录',如/apps/nginx/html -->对应'root'指令
$document_uri;
保存了当前请求中'不包含指令的URI',注意是'不包含请求'的指令,比如http://node101.yinzhengjie.org.cn/main/index.do?id=20190221&partner=search会'被定义为/main/index.do'
$host;
存放了'请求的host名称'
$http_user_agent;
'客户端浏览器'的详细信息
$http_cookie;
'客户端的cookie'信息
limit_rate 10240;
echo $limit_rate;
如果nginx服务器使用limit_rate配置了'显示网络速率',则会显示,如果'没有设置',则'显示0'
$remote_port;
客户端请求Nginx服务器时'随机打开的端口',这是每个'客户端自己的端口'
$remote_user;
已经'经过Auth Basic Module验证'的用户名
$request_body_file;
做'反向代理'时发给'后端服务器的本地资源'的名称
$request_method;
请求'资源的方式',GET、PUT、DELETE等
$request_filename;
当前'请求的资源文件的路径'名称,由root或alias指令与URI请求生成的文件'绝对路径',如:/apps/nginx/html/main/index.html
$request_uri;
包含'请求参数'的原始URI,'不包含主机名',如:/main/index.do?id=20190221&partner=search
$scheme;
请求的'协议',如ftp、https、http等
$server_protocol;
保存了'客户端请求资源'使用的协议的版,如HTTP/1.0、'HTTP/1.1'、HTTP/2.0等
$server_addr;
保存了'服务器的IP地址'
$server_name;
请求的'服务器的主机名'
$server_port;
请求的'服务器的端口号'
+++++++++++++++'补充知识点'+++++++++++++++
$arg_name 请求中的'name参数'-->请求的参数的名字,根据'具体情况'而定
$binary_remote_addr 远程地址的'二进制'表示
$body_bytes_sent 已发送的'消息体'字节数
$content_length HTTP请求信息里的"Content-Length"
$content_type 请求信息里的"Content-Type"
$host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名
$http_referer '引用地址'
$http_via '最后'一个访问服务器的'ip地址'
$is_args 如果请求行'带有参数',返回"?",否则'返回空字符串'
$nginx_version 当前运行的nginx版本号
$pid 'worker进程'的PID
$query_string 与$args'相同'
$realpath_root 按root指令或alias指令算出的'当前请求的绝对路径',其中的'符号链接'都会解析成真是文件路径
$request '用户请求'
$request_body 这个变量(0.7.58+)包含'请求的主要信息',在使用proxy_pass或fastcgi_pass指令的location中'比较有意义'
$request_body_file 客户端'请求主体'信息的'临时文件名'
$request_completion 如果'请求成功',设为"OK";如果'请求未完成'或者'不是'一系列请求中最后一部分则设为空
$request_filename 当前请求的文件路径名,比如/opt/nginx/www/test.php
$request_uri 请求的URI,'带参数'; 比如http://localhost:88/test1/
$uri 请求的URI,可能'和最初的值有不同',比如经过'重定向'之类的
$http_name 用来获取'任意请求头'的值
参考:
Nginx配置HTTP响应头修改和添加 | ModStart
Nginx 获取自定义请求header头和URL参数
Nginx(十一)变量_nginx 打印变量_wzj_110的博客-CSDN博客