详解Nginxlocation匹配规则
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解Nginxlocation匹配规则
语法规则
location [=|~|~*|^~] /uri/ { … }
前缀匹配时,Nginx 不对 url 做编码,因此请求为 /static/20%/aa ,可以被规则 ^~ /static/ /aa 匹配到(注意是空格)
多个 location 配置的情况下匹配顺序为
⾸先精确匹配 = ,如果匹配成功,则停⽌其他匹配
其次前缀匹配 ^~
其次是按⽂件中顺序的正则匹配
然后匹配不带任何修饰的前缀匹配。
最后是交给 / 通⽤匹配
当有匹配成功时候,停⽌匹配,按当前匹配规则处理请
location匹配顺序
"="前缀指令匹配,如果匹配成功,则停⽌其他匹配
普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使⽤^~,则停⽌其他匹配(正则匹配)
正则表达式指令匹配,按照配置⽂件⾥的顺序,成功就停⽌其他匹配
如果第三步中有匹配成功,则使⽤该结果,否则使⽤第⼆步结果
最后是交给 / 通⽤匹配
注意点
匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。
另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使⽤普通字符串配置的location顺序是⽆关紧要的,反正最后nginx会根据配置的长短来进⾏匹配,但是需要注意的是正则表达式按照配置⽂件⾥的顺序测试。
找到第⼀个⽐配的正则表达式将停⽌搜索。
⼀般情况下,匹配成功了普通字符串location后还会进⾏正则表达式location匹配。
有两种⽅法改变这种⾏为,其⼀就是使⽤“=”前缀,这时执⾏的是严格匹配,并且匹配成功后⽴即停⽌其他匹配,同时处理这个请求;另外⼀种就是使⽤“^~”前缀,如果把这个前缀⽤于⼀个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。
匹配模式及顺序
= #⽤于标准uri前,需要请求字串与uri完全匹配,如果匹配成功就停⽌向下匹配并⽴即处理请求。
~ #区分⼤⼩写
~* #不区分⼤写
!~ #区分⼤⼩写不匹配
!~* #不区分⼤⼩写不匹配
^ #匹配正则开头
$ #匹配正则结尾
\ #转义字符。
可以转. * ?等
* #代表任意长度的任意字符
location = /uri #开头表⽰精确匹配,只有完全匹配上才能⽣效。
location ^~ /uri #开头对URL路径进⾏前缀匹配,并且在正则之前。
location ~ pattern #开头表⽰区分⼤⼩写的正则匹配。
location ~* pattern #开头表⽰不区分⼤⼩写的正则匹配。
location /uri #不带任何修饰符,也表⽰前缀匹配,但是在正则匹配之后。
location / #通⽤匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
#不区分⼤⼩写匹配任何以gif、jpg、jpeg结尾的请求
location ~* .(gif|jpg|jpeg)$ {
}
#区分⼤⼩写匹配以.txt结尾的请求,并设置此location的路径是/usr/local/nginx/html/。
也就是以.txt结尾的请求将访问/usr/local/nginx/html/ 路径下的txt⽂件location ~ ^.+\.txt$ {
root /usr/local/nginx/html/;
}
# ^~ 以 /admin/ 开头的请求,都会匹配上
location ^~ /admin/ {
root /xvdb/mobai/
}
此时 /xvdb/mobai/⽬录中必须要有 admin ⽂件夹
#匹配成功: /admin/index.jsp
#匹配成功: /admin/login.jsp
#忽略⼤⼩写,包含/Images/
location ~* /Images/ {
}
#匹配成功: /test/Images/
#匹配成功: /images/
#不加任何规则则时,默认是⼤⼩写敏感,前缀匹配,相当于加了“^”与“~”
location /index/ {
}
#匹配成功: /index
#匹配成功: /index/index.html
#匹配失败: /test/index
#匹配失败: /Index
#精确匹配, 只匹配
location = / {
}
#匹配成功:
#匹配失败: /index
# 匹配到所有url
location / {
}
例⼦,有如下匹配规则:
location = / {
echo "规则A";
}
location = /login {
echo "规则B";
}
location^~ /static/ {
echo "规则C";
}
location^~ /static/files {
echo "规则X";
}
location ~ \.(gif|jpg|png|js|css)$ {
echo "规则D";
}
location ~* \.png$ {
echo "规则E";
}
location /img {
echo "规则Y";
}
location / {
echo "规则F";
}
那么产⽣的效果如下:
所以实际使⽤中,笔者觉得⾄少有三个匹配规则定义,如下:
# 直接匹配⽹站根,通过域名访问⽹站⾸页⽐较频繁,使⽤这个会加速处理,官⽹如是说。
# 这⾥是直接转发给后端应⽤服务器了,也可以是⼀个静态⾸页
# 第⼀个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第⼆个必选规则是处理静态⽂件请求,这是 nginx 作为 http 服务器的强项
# 有两种配置模式,⽬录匹配或后缀匹配,任选其⼀或搭配使⽤
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
# 第三个规则就是通⽤规则,⽤来转发动态请求到后端应⽤服务器
# ⾮静态⽂件请求就默认是动态请求,⾃⼰根据实际把握
# 毕竟⽬前的⼀些框架的流⾏,带.php、.jsp后缀的情况很少了location / {
proxy_pass http://tomcat:8080/
}
rewrite 语法
last – 基本上都⽤这个 Flag
break – 中⽌ Rewirte,不再继续匹配
redirect – 返回临时重定向的 HTTP 状态 302
permanent – 返回永久重定向的 HTTP 状态 301
1、下⾯是可以⽤来判断的表达式:
-f 和 !-f ⽤来判断是否存在⽂件
-d 和 !-d ⽤来判断是否存在⽬录
-e 和 !-e ⽤来判断是否存在⽂件或⽬录
-x 和 !-x ⽤来判断⽂件是否可执⾏
2、下⾯是可以⽤作判断的全局变量
例:
http://localhost:88/test1/test2/test.php?k=v
$host:localhost
$server_port:88
$request_uri:/test1/test2/test.php?k=v
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php redirect 语法
server {
listen 80;
server_name ;
index index.html index.php;
root html;
if ($http_host !~ "^star\.igrow\.cn$") {
rewrite ^(.*) $1 redirect;
}
}
防盗链
location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked ;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
根据⽂件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}。