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,不同点是^~依然遵守最长匹配规则,然而=不是,而是必须是严格精确匹配。