变量和if判断

2021-01-12 14:35:13 浏览数 (1)

变量

内置变量
代码语言: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;
 }
}

0 人点赞