HTTP模块提供的变量

339 阅读4分钟

除了http模块会提供大量的变量,还有nginx的HTTP框架也会提供一些变量。框架提供的变量不需要我们引入新的HTTP模块。

1、案例

   log_format vartest '$remote_addr - $remote_user [$time_local] "$request"'
                    '$status bytes_sent=$bytes_sent      body_bytes_sent=$body_bytes_sent "$http_referer"'
                    '"$http_user_agent" "$sent_http_abc"';

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  fxt.test.com localhost;
        access_log logs/test.log vartest;

        location / {
            set $limie_rate 10k;
            return 200 '
            arg_a: $arg_a,
            arg_b: $arg_b,
            args: $args,
            connection: $connection,
            connection_requests: $connection_requests,
            cookie_a: $cookie_a,
            uri: $uri,
            document_uri: $document_uri,
            request_uri: $request_uri,
            request: $request,
            request_id: $request_id,
            server_addr: $server_addr,
            server_name: $server_name,
            server_port: $server_port,
            server_protocol: $server_protocol,
            host: $host,
            http_host: $http_host,
            limit_rate: $limit_rate,
            hostname: $hostname
            ';
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

使用 curl -H 'Content-Length: 0' -H 'Cookie: a=c1' 'localhost:80?a=1&b=2',返回的结果:

2、HTTP框架提供的变量分类

   HTTP框架提供的变量分类可以分为以下几种:

  • HTTP请求相关的变量

  • TCP连接相关的变量

  • Nginx处理请求过程中产生的变量

  • Nginx系统变量

a、HTTP请求相关的变量

  • arg_参数名:URL中某个参数的值。

  • query_string:获取全部的参数。

  • args:获取全部的参数。

  • is_args:如果URL中有参数,则返回?,否则返回空,空在进行if判断时是false。

  • content_length:HTTP请求中标识包体长度的Content-Length长度的值。

  • content_type:请求包体类型的Content-Type值。

  • uri:请求的URI(资源定位符,不同于URL,没有?之后的参数)。

  • document_uri:同uri,历史原因定义的变量。

  • request_uri:请求的URL,包括URI以及完整的参数。

  • scheme:协议名,像HTTP或者HTTPS。

  • request_method:请求方法,像get或者post。

  • request_length:所有请求内容的大小,包括请求行,头部,包体等。

  • remote_user:由HTTP Basic Authentication协议传入的用户名,使用HTTP Basic Authentication时,客户端会弹出一个要求输入用户名和密码的弹出框,该值就是输入的用户名。

  • request_body_file:用于临时存放请求包体的文件,如果包体非常小,则不会存入文件,可以使用client_body_in_file_only强制所有包体存入文件,且可决定是否删除。

  • request_body:请求中的包体,当且仅当使用反向代理,且设定用内存暂存包体时才有效。

  • request:原始的url请求,含有方法和协议版本,例如:GET /?a=1&b=2 HTTP/1.1。

重点:

host变量:

  • 如果请求行中有Host字段,host值即为Host字段值。

  • 如果没有Host字段,则从请求行中取,即我们使用http://localhost访问,host值为localhost。

  • 如果没有请求主机名,也没有Host字段,那么就使用匹配到的server_name值。比如nginx.conf中配置的server_name为localhost,我们使用127.0.0.1访问,匹配到了,host值就为localhost。

b、tcp链接相关的变量

  • binary_remote_addr:客户端地址的整型格式,IPV4是4个字节,IPV6是16个字节。(对端信息)

  • connection:递增的链接序号。

  • connection_requests:当前连接上执行过的请求数,对keepalive有意义。

  • remote_addr:客户端地址。

  • remote_port:客户端端口。

  • proxy_protocol_addr:若使用了proxy_protocol协议,则返回协议中的地址(对端地址),否则返回空。

  • proxy_protocol_port:若使用了proxy_protocol协议,则返回协议中的端口(对端端口)。

  • server_addr:服务器的地址。

  • tcp_info:tcp内核参数,例如tcpinfo_rtttcpinfo\_rtt,tcpinfo_rttvar,tcpinfo_snd_cwndtcpinfo\_snd\_cwnd,tcpinfo_rcv_space。

  • server_protocol:服务器协议,例如HTTP/1.1。

c、nginx处理请求的过程中产生的变量

  • request_time:请求处理到现在的耗时,单位为秒,精确到毫秒。
  • server_name:匹配上的serve_name的值。
  • https:如果开启了TLS/SSL,则返回on,否则返回空。
  • request_completion:若请求处理完,则返回on,否则返回空。
  • request_id:以16进制输出的请求标识id,该id共含有16个字节,是随机生成的。
  • request_filename:待访问文件的完整目录。
  • document_root:由URI和root/alias组成的文件夹路径。
  • realpath_root:将document_root中的软连接替换成真正的路径。
  • limit_rate:返回客户端响应时的速度上限,单位为每秒字节数,可以通过set指令进行修改。

d、发送http响应时的变量

  • body_bytes_send:响应中body包体的长度。
  • bytes_send:全部http响应的长度。
  • status:http响应中的状态码。
  • sent_tralier_名字:把响应结尾内容中的值返回。

e、nginx系统变量

  • time_local:以本地时间标准输出的当前时间,例如:14/Nov/2018:15:55:37。
  • time_iso8601:使用ISO8601标准输出的当前时间,例如:2018-11-14T15:55:37+08:00。
  • nginx_version:nginx的版本号。
  • pid:所属worker的进程id。
  • pipe:使用了管道则返回p,否则返回.。
  • hostname:所属服务器的主机名,与hostname输出一致。
  • msee:1970年1月1日到现在的时间,单位为秒,小数点后精确到毫秒。