Nginx - Location 匹配规则

语法规则

location = /uri        = 表示精确匹配某个uri
location ^~ /uri       ^~ 表示精确的前缀匹配以uri开头的请求,优先级在正则之前
location ~ uri         ~ 表示区分大小写的正则匹配,这里的uri就是一个正则表达式
location ~* uri        ~* 表示不区分大小写的正则匹配,这里的uri就是一个正则表达式
location /uri          不带修饰符,表示精确的前缀匹配以uri开头的请求,优先级在正则之后
location /             通用匹配,未匹配到其他location的请求都会走到这里。 
                       其实就相当于匹配以/开头的请求,自然就能匹配全部

匹配顺序优先级

当存在多个同级location时,表达式越精确,优先级越高

例如:匹配http://localhost/wapabcd 时,/wap 优先级高于/wa

当存在多个不同级location时,匹配的优先级如下:

1、 =(完全精确匹配)
2、 ^~(带修饰符的前缀精确匹配)
3、 ~(区分大小写的正则匹配)
4、 ~*(不区分大小写的正则匹配)
5、 /uri(无修饰符的前缀精确匹配)
6、 /(通用匹配)

例子:

#rule1 ,精确匹配http://localhost/q/a.html
location = /q/a.html { 
    echo "rule '=', /q/a.html";
}

#rule2 ,匹配以q开始的请求,如:http://localhost/qwer、http://localhost/q/
#但无法匹配 http://localhost/q/a.html,因为rule1优先级高于rule2,所以会被rule1截获
location ^~ /q { abc
    echo "rule '^~',start with /q";
}

#rule3    这里功能和rule2相同,但是无法生效,因为正则的优先级低于^~
location ~ ^/q.* { 
    echo "regular expression '~',start with /q";
}

#rule4    这里匹配所有以.js/.css结尾的请求,如http://localhost/a/jquery.js,
#但无法匹配http://localhost/q/jquery.js,因为rule2优先级高于rule4,所以会被rul2截获
location ~ \.(js|css)$ {
    echo "regular expression '~',end with .js/.css";
}

#rule5    这里匹配不区分大小写的以.js/,css结尾的请求,如http://localhost/a/jquery.JS
location ~* \.(js|css)$ {
    echo "regular expression '~',end with .jpeg/.css";
}

#rule6    无修饰符地匹配以w开始的请求,如http://localhost/wert、http://localhost/w/
#但无法匹配 http://localhost/w/a.js,因为rule4/5的优先级高于rule6
location /w {
    echo "rule no modifier '/w',start with /w";
}

#rule7    无修饰符地匹配以wa开始的请求,如http://localhost/waert、http://localhost/wa/
#此时优先级高于rule6,因为在修饰符相同的情况下,越精确则越优先
location /wa {
    echo "rule no modifier '/wa',start with /wa";
}    

#rule8    通用匹配,接受所有未被其他location捕获的请求
#其实本质上是因为所有请求都是以/开始的,所以能够匹配所有请求
location / {
    echo "rule '/', match all requests"
}