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博客

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: