nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用
变量可以分为内置变量和自定义变量
内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值
官方文档:http://nginx.org/en/docs/varindex.html
变量 | 说明 |
---|---|
$remote_addr | 客户端ip |
proxy_add_x_forwarded_for | 包括客户端IP和中间经过的所有代理的IP,没有时则=$remote_addr |
$args | 存放url的参数,如:http://xx.com/a/index.do?id=2021&agent=1,变量内容位:id=2021&agent=1 |
$arg_name | 请求行中的参数 name |
$document_uri | 除了url的参数以外的uri,如http://hj.com/a/index.do,变量内容为:/a/index.do |
$document_root | 网页家目录,针对当前请求的根路径设置值 |
$host | 请求主机头字段,否则为服务器名称,如:blog.sakmon.com |
$limit_rate | 若有配置limit_rate,则速率以配置为标准,0表示不限速 |
$remote_port | 客户端访问nginx时的随机端口 |
$remote_user | 完成basic认证的用户名 |
$request | 请求的方法、资源、协议,如:GET ?a=1&b=2 HTTP/1.1 |
$request_time | 从接受用户请求的第一个字节到发送完响应数据的时间,完整请求时间 |
$request_body_file | 客户端请求主体信息的临时文件名 |
$request_body | 客户端请求体 |
$request_method | 请求资源的方式,如:GET、PUT等 |
$request_filename | 当前请求的资源的本地磁盘路径,如:root设置/2013/81.html |
$request_uri | 请求的原始uri,不包含主机名,相当于:document_uri+args两个变量,如:/2013/81.html?a=1&b=2 |
$request_completion | 如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK |
$scheme | 请求的协议,http、https、ftp、ssh等 |
$https | https协议是否开启,开启则是:"on",无则是空字符串 |
$time_local | 服务器本地时间 |
time_iso8601 | 采用 ISO 8601 标准格式的当地时间 |
$server_protocol | 客户端请求资源使用的协议版本,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1 |
$server_addr | 访问的服务器的ip,在完成一次系统调用后可以确定这个值 |
$server_name | 访问的服务器的FQDN |
$server_port | 访问的服务器的端口 |
$http_字段 | 字段是请求报文任意首部字段,可输出首部字段的内容 |
$cookie_键名 | 显示指定cookie,cookie以键值对存在 |
$status | 响应码 |
$body_bytes_sent | 发送的数据大小,不包括响应头,响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40 |
$bytes_sent | 发送到客户端的字节数 |
$http_referer | 转到此页面的之前的页面,如http://hj.com/aaa.html的referer来自http://hj.com/也就是跳转过来的原链接。可用于防盗链 |
$invaild_referer | 记录不合法的referer,可用于防盗链 |
$upstream_cache_status | nginx的代理缓存的信息,缓存主机是谁、缓存状态 |
$upstream_response_time | 从建立连接到发送完最后一个内容字节的时间,这个是我们需要关注的,因为客户端的请求和客户所在网络有关 |
$upstream_connect_time | 跟后端server建立连接的时间,如果是到后端使用了加密的协议,该时间将包括握手的时间 |
$upstream_header_time | 接收后端server响应头的时间 |
$connection_time | 连接时间,以秒为单位,精度为毫秒 |
$binary_remote_addr | 客户端ip(二进制) |
$content_length | 等于请求行的“Content_Length”的值 |
$content_type | 等于请求行的“Content_Type”的值 |
$hostname | 如:centos53.localdomain |
is_args | 如果有args参数,这个变量等于”?”,否则等于”",空值,如? |
query_string | 与args相同 等于当中URL的参数(GET),如a=1&b=2 |
uri | 这个变量指当前的请求URI,不包括任何参数(见args) 如:/2013/81.html |
proxy_protocol_addr | 若使用了 proxy_protocol 协议则返回协议中的地址,否则返回空 |
proxy_protocol_port | 若使用了 proxy_protocol 协议则返回协议中的端口,否则返回空 |
proxy_protocol_server_addr | PROXY 协议标头中的服务器地址 |
sent_http_字段 | 响应头字段 |
upstream_cache_status | 记录缓存是否命中。Miss、Hit、Expire为字面意思,Stale为命中旧缓存,Revaliddated为验证旧缓冲为有效,updating为命中旧缓存但内容正在更新,bypass为从原始服务器响应 |
以下变量仅在开启http_geoip_module模块有效
变量 | 含义 |
---|---|
$geoip_country_code | 两个字母的国家/地区代码,例如“RU”,“US” |
$geoip_country_code3 | 三个字母的国家/地区代码,例如“RUS”,“USA” |
$geoip_country_name | 国名,例如“俄罗斯联邦”,“美国” |
$geoip_area_code | 电话区号(仅限美国) |
$geoip_city_continent_code | 两个字母的大陆代码,例如“EU”,“NA” |
$geoip_city_country_code | 两个字母的国家/地区代码,例如“RU”,“US” |
$geoip_city_country_code3 | 三个字母的国家/地区代码,例如“RUS”,“USA” |
$geoip_city_country_name | 国名,例如“俄罗斯联邦”,“美国” |
$geoip_dma_code | 根据Google AdWords |
$geoip_latitude | 纬度 |
$geoip_longitude | 经度 |
$geoip_region | 双符号国家区域代码(地区,领土,州,省,联邦土地等),例如“48”,“DC” |
$geoip_region_name | 国家地区名称(地区,领土,州,省,联邦土地等),例如“莫斯科市”,“哥伦比亚特区” |
$geoip_city | 城市名称,例如“莫斯科”,“华盛顿” |
$geoip_postal_code | 邮政编码 |
$geoip_org | 组织名称,例如“墨尔本大学” |
注意: 首部字段中“-”要变成“_”,大小写不敏感
location /echo {
echo $http_cookie; 客户端cookie信息
}
自定义变量名称和值,用于server、location、if
set $变量名 value;
location /echo {
set $test 123456;
echo $test;
set $my $host;
echo $my:$remote_addr;
}
仅用于http段,支持正则处理
map 源变量 赋值变量 {
[default 值;]
...
}
map $host $xxx {
default www.hj.com;
hj www.hj.com;
~xxx xxx;
}
原理:
#从$host变量读取值,判断后传给$xxx,相当于
if $host = hj
$xxx=www.hj.com
elif $host = xxx #大小写不敏感
$xxx=xxx
else
$xxx=www.hj.com
http {
#单个变量的hash最大值
map_hash_bucket_size 128;
#整个map的hash表大小
map_hash_max_size 2048;
map $http_origin $corshost {
default "";
"~http://www.xx.com" http://www.xx.com;
"~http://www.bb.com" http://www.bb.com;
}
server {
add_header Access-Control-Allow-Origin $corshost;
#开启请求头cookie,一旦开启,上面的必须指定明确的、与请求网页一致的域名,不能再设为'*'通配
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods 'PUT,POST,GET,DELETE,OPTIONS';
add_header Access-Control-Allow-Headers 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With';
location / {
if ($request_method = 'OPTIONS') {
return 200;
}
}
}
}