nginx ngx_http_core_module模块变量
示例 http://127.0.0.1/test/abc?name=zhangsan&age=18
常用
- $arg_name zhangsan
- $args name=zhangsan&age=18
- $query_string 请求 URI中的参数,与 $args相同,然而 $query_string是只读的不会改变
- $uri /test/abc
- $host 127.0.0.1
- $request_method 表示 HTTP请求的方法名,大写,如 GET、PUT、POST等
- $scheme 表示 HTTP scheme,如在请求 https://nginx.com/中表示 https
- $request_uri /test/abc?name=zhangsan&age=18
- $http_HEADER 表示当前 HTTP请求中相应头部的值。HEADER名称全小写。例如,示请求中 Host头部对应的值 用 $http_host表
- $sent_http_HEADER 表示返回客户端的 HTTP响应中相应头部的值。HEADER名称全小写。例如,用 $sent_ http_content_type表示响应中 Content-Type头部对应的值
- \(is_args 表示请求中的 URI是否带参数,如果带参数,\)is_args值为?,如果不带参数,则是空字符串
- $request_body 表示 HTTP请求中的包体,该参数只在 proxy_pass或 fastcgi_pass中有意义
- $request
GET /test/abc?name=zhangsan&age=18 HTTP/1.1
- $HTTP_X_REAL_IP 表示客户端的地址
- $remote_addr 表示客户端的地址,如果有代理的话,表示代理机器的
- $remote_port 表示客户端连接使用的端口,如果有代理的话,表示代理机器的
- $remote_user 表示使用 Auth Basic Module时定义的用户名
不常用
- $limit_rate 表示当前连接的限速是多少,0表示无限速
- $nginx_version 表示当前 Nginx的版本号
- $request_filename 表示用户请求中的 URI经过 root或 alias转换后的文件路径 /usr/share/nginx/html/test/abc
- $request_body_file 表示 HTTP请求中的包体存储的临时文件名
- $request_completion 当请求已经全部完成时,其值为 “ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range访问的并不是文件的最后一块,那么其值也是空字符串。
- $hostname vm_51_8_centos # nginx所在机器的名称
- $server_addr 表示服务器地址 127.0.0.1
- $server_name 表示服务器名称 127.0.0.1
- $server_port 表示服务器端口 80
- $server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1或 HTTP/1.0
nginx常用配置
- location的配置优先级 静态 > 正则 > 默认
注意:优先级逐级降低
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写的不匹配正则 5
!~* 不区分大小写的不匹配正则 6
/ 通用匹配,任何请求都会匹配到 7
location /a {
default_type application/json;
return 200 '{"status":"success","result":"hello world"}';
}
location /b {
default_type text/html;
charset utf-8;
# add_header Content_Type 'text/html; charset=utf-8';
return 200 '你好,世界!';
}
location /c {
proxy_pass http://127.0.0.1:3001;
}
location ~ ^/d/(.*)$ {
proxy_pass http://127.0.0.1:3002/$1?$query_string;
}
/* 组判断begin */
set $is_matched 0;
// 请求头x-env: 3003
if ($http_x_env = 3003) {
proxy_pass http://127.0.0.1:3003;
set $is_matched 1;
}
if ($is_matched = 0) {
// 其它操作
}
/* 组判断end */
- location下使用if的情况
- if匹配时,if里面的语句都会执行,执行多个proxy_pass时以最后一个if的为准,其他if语句的add_header仅在当前if语句中生效。
rewrite模块指令
- break
语法:break
默认值:none
使用字段:server, location, if
完成当前设置的重写规则,停止执行其他的重写规则。
- if
语法:if (condition) { … }
默认值:none
使用字段:server, location
注意:尽量考虑使用trp_files代替。
判断的条件可以有以下值:
1. 一个变量的名称:空字符传”“或者一些“0”开始的字符串为false。
2. 字符串比较:使用=或!=运算符
3. 正则表达式匹配:使用~(区分大小写)和~*(不区分大小写),取反运算!~和!~*。
4. 文件是否存在:使用-f和!-f操作符
5. 目录是否存在:使用-d和!-d操作符
7. 文件、目录、符号链接是否存在:使用-e和!-e操作符
8. 文件是否可执行:使用-x和!-x操作符
- return
语法:return code
默认值:none
使用字段:server, location, if
停止处理并为客户端返回状态码。非标准的444状态码将关闭连接,不发送任何响应头。可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416与500-504。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。
- rewrite
语法:rewrite regex replacement flag
注意:rewrite外部时post body会丢失,推荐只有get方法时才考虑使用该指令,其他的用proxy_pass替代
默认值:none
使用字段:server, location, if
按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。可以在重写指令后面添加标记。
注意:如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
尾部的标记(flag)可以是以下的值:
last - 停止处理重写模块指令,之后搜索location与更改后的URI匹配。
break - 完成重写指令。
redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。
permanent - 返回301永久重定向。
- set
语法:set variable value
默认值:none
使用字段:server, location, if
为给定的变量设置一个特定值。
- rewrite_log
语法:rewrite_log on | off
默认值:rewrite_log off
使用字段:server, location, if
变量:无
启用时将在error log中记录notice级别的重写日志。
- uninitialized_variable_warn
语法:uninitialized_variable_warn on|off
默认值:uninitialized_variable_warn on
使用字段:http, server, location, if
控制是否记录未初始化变量的警告信息。
rewite规则
- 重写规则的第一部分都是一个正则表达式
- 示例:
^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$
- $1是两个小写字母组成的字符串,$2是由小写字母和0到9的数字组成的5个字符的字符串,$3将是个文件名,$4是png、jpg、gif中的其中一个。
- 重写规则的第二部分是URI
- 示例:
/data?file=$3.$4
- 如果这个URI不匹配nginx配置的任何location,那么将给客户端返回301(永久重定向)或302(临时重定向)的状态码来表示重定向类型。该状态码可以通过第三个参数来明确指定。
- 重写规则的第三部分
- last标记将导致重写后的URI搜索匹配nginx的其他location,最多可循环10次。如:
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 last;