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

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

文章目录

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

一、简介

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

二、准备

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

  1. 下载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
    
  2. 解压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/
    
  3. 生成Makefile,–prefix为指定安装目录

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

    #编译
    make
    
  5. 安装

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

    /usr/local/nginx/sbin/nginx
    

三、知识点

3.1 内置变量

  1. nginx内置变量可以直接读取的,以 符 号 开 头 , 如 : 符号开头,如: args表示获取参数信息,更多内置变量在后续示例中给出。
  2. 对于请求中的自定义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

你可能感兴趣的:(nginx)