变量
内置变量
代码语言:javascript
复制$request_time 表示从接受用户请求的第一个字节到发送完整响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间。
$upstream_response_time 表示从nginx向后端(upstream定义的主机列表)建立连接开始到接受完数据,然后关闭连接为止的时间。
$http_referer 客户请求的完整'URI'
$http_host 客户端请求的IP 端口
$scheme 使用的协议,'http'或者'https'
$host 请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值),值为小写,不包含端口。
$arg_PARAMETER 这个变量值为GET请求中变量名'PARAMETER'参数的值
$gzip_ratio 如果开启了gzip压缩,此变量可以记录下压缩率。
$args 这个变量等于GET请求中的参数
$binary_remote_addr 二进制码形式的客户端地址。
$body_bytes_sent 传送页面的字节数
$content_length 请求头中的Content-length字段。
$content_type 请求头中的Content-Type字段。
$cookie_COOKIE COOKIE的值
$document_root 当前请求在root指令中指定的值。
$document_uri 与'$uri'相同
$hostname 机器名使用 gethostname系统调用的值
$http_HEADER HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值), $http_referer...;
$sent_http_HEADER HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如: $sent_http_cache_control, $sent_http_content_type...;
$is_args:如果$args设置,值为"?",否则为""
$limit_rate:这个变量可以限制连接速率
$nginx_version 当前运行的nginx版本号
$query_string 与$args相同
$remote_addr 客户端的IP地址
$remote_port 客户端的端口
$remote_user 已经经过Auth Basic Module验证的用户名
$request_filename 当前连接请求的文件路径,由root或alias指令与URI请求生成。
$request_body 这个变量(0.7.58 )包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义
$request_body_file 客户端请求主体信息的临时文件名
$request_completion 如果请求成功,设为"OK";如果请求未完成或者不是一系列请求中最后一部分则设为空
$request_method 这个变量是客户端请求的动作,通常为GET或POST
包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作
$request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数
$server_name 服务器名称
$server_port 请求到达服务器的端口号
$server_protocol 请求使用的协议,通常是'HTTP/1.0'或'HTTP/1.1'
$uri 请求中的当前URI(不带请求参数,参数位于$args),不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html
定义变量 set
代码语言:javascript
复制--示例,通过定义变量'$my_addr'来动态指定'upstream'
location / {
set $my_add "172.16.0.14";
proxy_pass http://$my_add/;
}
变量映射 map
代码语言:javascript
复制map指令是由'ngx_http_map_module'模块提供的,默认安装该模块
--实例
--编辑配置文件
[root@linux /]# vim /usr/local/nginx/conf.d/ww.conf
map $http_user_agent $user_agent {
default "PC端";
~*curl "CURL命令";
~*iphone "IOS端";
~*android "Android端";
}
server {
listen 80;
location /echo {
echo "hello 您使用的是:$user_agent";
}
}
--重载nginx
/usr/local/nginx/sbin/nginx -s reload
-验证
[root@linux /]# curl 172.16.0.1/echo
hello 您使用的是:CURL命令
条件判断 if
代码语言:javascript
复制--语法
if(condition){…}
用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句
if指令不支持嵌套,不支持多个条件&&和||处理
代码语言:javascript
复制--条件(condition)判断标识
'~' 为区分大小写匹配
'~*' 为不区分大小写匹配
'!~' 区分大小写不匹配
'!~*' 不区分大小写不匹配
--运算符
'-f'和'!-f' 判断是否存在文件
'-d'和'!-d' 判断是否存在目录
'-e'和'!-e' 判断是否存在文件或目录
'-x'和'!-x' 判断文件是否可执行
实例
代码语言:javascript
复制--禁止使用'chrome'访问
if ($http_user_agent ~* chrome){
return 502;
}
--禁止访问'admin'目录
if ($request_uri ~* /admin/(.*)){
return 502;
}
--如果请求的文件名不存在,则反向代理到'http://172.16.0.14',这里的break是停止rewrite检查
location / {
if (!-f $request_filename){
break;
proxy_pass http://172.16.0.14;
}
}