Nginx正则表达式匹配操作符
~ 区分大小写(大小写敏感)匹配成功
!~ 区分大小写匹配失败
~* 不区分大小写匹配成功
!~* 不区分大小写匹配失败
^ 以什么开头的匹配
$ 以什么结尾的匹配
- 代表任意字符
判断文件,文件夹
f和!-f用来判断是否存在文件
d和!-d用来判断是否存在目录
e和!-e用来判断是否存在文件或目录
x和!-x用来判断文件是否可执行
全局变量
$args 请求中的参数,如www.abc.com/test/hello?a=1&b=2的$args就是a=1&b=2
$document_root Nginx虚拟主机配置文件中的root参数对应的值
$document_uri 当前请求中不包含指令的URI,如www.abc.com/test/hello?a=1&b=2的document_uri就是/test/hello,不包含后面的参数
$host 主机头,也就是域名
$http_user_agent 客户端的详细信息,也就是浏览器的标识,用curl -A可以指定
$http_cookie 客户端的cookie信息
$limit_rate 如果Nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置,则显示0
$remote_addr 客户端的公网IP
$remote_port 客户端的端口
$request_method 请求资源的方式,GET/PUT/DELETE等。可以通过这个参数来对请求分发完成读写分析
$request_filename 当前请求的资源文件的路径名称,相当于是$document_root/$document_uri的组合
$request_uri 请求的链接,包括$document_uri和$args
$scheme 请求的协议,如ftp、http、https
$server_protocol 客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等
$server_addr 服务器IP地址
$server_name 服务器的主机名
$server_port 服务器的端口号
$uri 和$document_uri相同
$http_referer 客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳过来的
实例
args:name=zhangsan&age=15
document_root:/home/wwwroot/default/wounion/dragonfly/public
document_uri:/test/hello
host:jiqing.wounion.com
http_user_agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36
http_cookie:PHPSESSID=3ire1fr9bl3qdpd787pv0qb7a5
limit_rate:0
remote_addr:127.0.0.1
remote_port:43180
request_method:GET
request_filename:/home/wwwroot/default/wounion/dragonfly/public/test/hello
request_uri:/test/hello?name=zhangsan&age=15
scheme:http
server_protocol:HTTP/1.1
server_addr:127.0.0.1
server_name:jiqing.wounion.com
server_port:80
uri:/test/hello
http_referer:
常用正则:
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
- : 重复1次或更多次
- : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的结束
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
自定义路径变量 $1,$2,$3
匹配正则表达式时,匹配到的值通过$1、$2、$3、…、$9使用
location ~* /out/(.*) {
default_type text/html ;
return 200 "hello, $1";
}
location ~* /out2/(.*)/(.*) {
default_type text/html ;
return 200 "var1 = $1, var2 = $2";
}
location ~ /iserver/services/(.)/rest/maps/(.)/queryResults(.) {
default_type text/html ;
set $arg1 $1;
set $arg2 $2;
set $arg3 $3;
if ($arg1 = "map-cypt") {
proxy_pass "http://127.0.0.1:81/test/out/$arg1";
break;
}
return 200 "var1 = $arg1, var2 = $arg2, var3 = $arg3, args = $args";
}
使用 !-e $request_filename 变量
- e表示只要filename存在,则为真,不管filename是什么类型,当然这里加了!就取反
额外的一些
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真