一文说清nginx规则匹配(含案例分析)


概述: 在nginx中,匹配分很多情形,例如:区分大小写匹配、不区分大小写匹配、有强匹配开头、有模糊匹配某些字符、有匹配后重写动作、有匹配反向代理动作、有匹配后终止操作、还有匹配全局变量类型等等,在很多情形中,匹配动作也存在优先策略,来看看下面的案例。


案例一、

server {

......
......

......

location ~ .*.(jpg|png)$ {

root /opt/nginxtest;

expires 1d;

#deny all;

}

}



说明:
1、以上location匹配了所有jpg与png文件,如果该location中没有指定root,将继承server段中的root配置,如果有指定root,location中的root优先;



2、location中无论有没有指定root ,deny all如果启用,将优先生效,由此可判断,只要类型为jpg与png文件,必定会进入此location中;


案例二、


server {

......
......

......

location ~ ^/upload/.*.(jpg|png)$ {

rewrite ^/upload/(.*).png /test/upload/d1/$1.png permanent;

#root /opt/nginxtest/d1;

}
}



说明:
1、此规则限定与强匹配了$host 的/后,以upload开头,并且请求类型为jpg与png结尾的文件;



2、执行重写,强匹配以上1规则后进入rewrite , 例如http//$host/upload/1/123.png 将会到http//$host/test/upload/d1/1/123.png ;


3、如果该location中没有指定root,将继承server段中的root配置,如果有指定root,location中的root优先;



案例三、


server {

......
......

......

location ~ /(upload|test)/.*.(jpg|png)$ {

rewrite ^/upload/(.*).jpg /d1/$1.jpg permanent;

rewrite /upload/(.*).png /d1/$1.png permanent;

#root /opt/nginxtest/d1;

}

}



说明:
1、此规则模糊匹配$uri,请求中包含upload或test即可继续执行,并且请求类型为jpg与png结尾的文件;


2、执行重写,匹配以上1规则后进入rewrite , 但需要注意,此处jpg与png类型不同,并且jpg中是强匹配^/,而png是模糊匹配,例如:http//$host/upload/1/123.png 将会到http//$host/d1/1/123.png ;例如:http//$host/test/upload/1/123.jpg 将会到 /opt/nginxtest/test/d1/121.png拿取文件;


3、而http//$host/test/d1/121.png的请求会直接拿取/opt/nginxtest/test/d1/121.png文件,因为此location虽然进来了,但没有匹配到重写规则,还是一样,如果该location中没有指定root,将继承server段中的root配置,如果有指定root,location中的root优先;

案例四、


server {

......
......

......

location ~ /upload/.*.(gif|jpeg)$ {

if ( $request_uri ~* "myid" ) {

rewrite ^/upload/(.*).jpeg$ /jpeg/$1.jpeg permanent;

}

#deny all;

#root /opt/nginxtest/d1;

}
}



说明:
1、此规则模糊匹配$uri,请求中包含只要upload,并且请求类型为jpg与png结尾的文件即可继续执行;

2、执行重写,匹配以上1规则后进入判断$request_uri 和执行rewrite , 注意jpeg中是强匹配^/ 接upload, 且 $request_uri 带有“myid” , 则rewrite , 例如: http//$host/upload/1/123.jpeg?myid=123 将会到 http//$host/jpeg/1/123.jpeg?myid=123 ; 例如 http//$host/upload/1/123.jpeg 将会直接拿取/opt/nginxtest/upload/1/121.png文件,注意,如果此location中指定了root则取此root,如果没有则取server段中的root;


3、此location中,如果$request_uri 匹配,则优先rewrite , 同时启用deny all , root ,则deny 生效;

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章