Location匹配的url的语法规则:

syntax: location [=|~|~*|^~|@] /uri/ { … }

default: no

context: server
=             表示精确匹配

^~             表示普通字符匹配,不继续匹配正则,一般用来匹配目录

~             表示区分大小写的正则匹配

~*              表示不区分大小写的正则匹配

!~ 和!~*       分别表示区分大小写和不区分大小写不匹配的正则

@                 定义一个命名的location,使用在内部重定向时,例如 error_page,try_files 

/                   通用匹配,如果没有其它location匹配,任何请求都会匹配到

 

1、location依据不同的前缀=、^~、~、~* 和不带任何前缀的(因为[]表示可选,可以不要的),表达不同的含义,。简单的说尽管location的/uri/ 配置一样,但前缀不一样,表达的是不同的指令含义

2、查询字符串不在URI范围内,例如:/films.htm?fid=123 的URI是/films.htm
3、这些不同前缀,分为两大类:正则location和普通location。~ 和~* 前缀表示正则location ,~ 区分大小写,~* 不区分大小写;其他前缀(包括:=、^~ 和@ )和无任何前缀的都属于普通location

 

匹配顺序:
1、精确匹配到=定义的loacation,使用这个location,停止搜索;
2、所有剩下的普通location,最长的匹配,如果这个最长location带有^~,使用这个location,停止搜索,否则:
3、存储这个最长location;
4、按配置文件中的顺序匹配正则location;
5、匹配到第一条正则location,使用这个location,停止搜索;
6、没有匹配到正则location,使用第二步中存储的最长location。

 

用一句话概括就是:先普通,后正则,正则location匹配让步普通location的严格精确匹配结果,但覆盖普通location的最长匹配结果


^~ 和= 都能阻止继续搜索正则location的话,那它们之间有什么区别呢?区别很简单,共同点是它们都能阻止继续搜索正则location,不同点是^~依然遵守最长匹配规则,然而=不是,而是必须是严格精确匹配。