nginx中内置变量及map类型使用

it2023-11-28  80

nginx中内置变量及map类型使用

文章目录

nginx中内置变量及map类型使用一、简介二、准备三、知识点3.1 内置变量3.2 map 四、示例4.1 自定义配置文件4.2 测试

一、简介

这里介绍nginx中常用的内置变量及map类型使用。

二、准备

为便于测试,先在nginx中安装echo-nginx-module模块。安装步骤如下:

下载echo-nginx-module模块包和nginx安装包

#下载echo-nginx-module模块包 wget https://github.com/openresty/echo-nginx-module/archive/v0.62.tar.gz #下载nginx安装包 wget http://nginx.org/download/nginx-1.19.3.tar.gz

解压echo-nginx-module模块包和nginx安装包

#解压nginx安装包 tar -zxvf nginx-1.19.3.tar.gz -C ~/program/ #解压nginx安装包 tar -zxvf v0.62.tar.gz -C ~/program/nginx-1.19.3/module/

生成Makefile,–prefix为指定安装目录

#生成Makefile,--prefix为指定安装目录,这里为/usr/local/nginx ./configure --prefix=/usr/local/nginx --add-module=module/echo-nginx-module-0.62

编译

#编译 make

安装

#安装,如果是更新已存在的nginx,则使用命令make upgrade make install

启动

/usr/local/nginx/sbin/nginx

三、知识点

3.1 内置变量

nginx内置变量可以直接读取的,以 符 号 开 头 , 如 : 符号开头,如: args表示获取参数信息,更多内置变量在后续示例中给出。对于请求中的自定义header值,通过在自定义header名前添加http_即可获取,如:通过$http_language获取请求header名为language的值。

3.2 map

map类型用于变量映射,放在http模块中(不是server模块),格式为:

map $var1 $var2{...}

其中key可为模式匹配,以表示大小写不敏感,*表示大小写敏感。{}内关键字有:

default :表示默认值 include:包含其它映射文件

四、示例

4.1 自定义配置文件

这里在nginx的conf目录下,添加servers目录及自定义配置文件dragon.com.conf,同时在conf目录的nginx.conf引于配置文件(include servers/*.conf;)。配置文件dragon.com.conf内容如下:

map $http_language $target_language{ "chinese" "chinese_target"; "english" "english_target"; default "default_language"; #没有匹配时设置的默认值 } server{ listen 8080; server_name dragon.com; location ~ /hello/(.*) { charset utf-8; #设置转发时的header值 proxy_set_header language $http_language; #直接打印指定字符串 echo "hello world"; echo http_language:$http_language; #获取请求header,在原header名前添加http_即为新header名, 如原header名为:language,则新header名为http_language echo target_language:$target_language; #这里是经map映射后的值,如:chinese_target echo request_suffix:$1; #请求后后缀,如:chinese/river #参数信息 echo args: $args; #参数,如:name=apple echo is_args: $is_args; #是否有参数,有为?,没有为空串,如:? echo query_string: $query_string; #包含uri和参数,如:name=apple echo request_body: $request_body; #请求体,如: #请求地址 echo uri: $uri; #uri,如:/hello/chinese/river echo request_uri: $request_uri; #请求uri,包含参数,如:/hello/chinese/river?name=apple #请求信息 echo "-----请求信息-----"; echo scheme: $scheme; #scheme,如:http echo content_type: $content_type; #如:application/json echo request_method: $request_method; #如:POST echo request: $request; #完整请求, POST /hello/chinese/river?name=apple HTTP/1.1 echo request_time: $request_time; #接收请求到发送完响应的时间,如0.000 echo http_referer: $http_referer; #referer echo http_cookie: $http_cookie; #cookie #服务端信息 echo host: $host; #请求host,如:dragon.com echo hostname: $hostname; #nginx所在机器名 echo server_name: $server_name; #服务名,如:dragon.com echo server_port: $server_port; #服务端口,如:dragon.com echo server_addr: $server_addr ; #服务地址:如:127.0.0.1 #客户端信息 echo http_user_agent: $http_user_agent; #agent信息,如:Apache-HttpClient/4.5.12 (Java/11.0.6) echo remote_addr: $remote_addr;#客户端地址,如:127.0.0.1 echo remote_port: $remote_port;#客户端端口,如:60163 #响应信息 echo status: $status; #响应码,如:200 } }

接着重新加载nginx,

sudo sbin/nginx -s reload

4.2 测试

请求:

POST http://dragon.com:8080/hello/chinese/river?name=apple Accept: application/json Content-Type: application/json language:chinese

响应:

hello world http_language:chinese target_language:chinese_target request_suffix:chinese/river args: name=apple is_args: ? query_string: name=apple request_body: uri: /hello/chinese/river request_uri: /hello/chinese/river?name=apple status: 200 scheme: http content_type: application/json request_method: POST request: POST /hello/chinese/river?name=apple HTTP/1.1 request_time: 0.000 http_referer: http_cookie: host: dragon.com hostname: chinademacbook-pro.local server_name: dragon.com server_port: 8080 server_addr: 127.0.0.1 http_user_agent: Apache-HttpClient/4.5.12 (Java/11.0.6) remote_addr: 127.0.0.1 remote_port: 60163
最新回复(0)