location有定位的意思。根据uri来定位不同的部分。 语法: location[=|~|~*|^~] patt { } = :表示精确匹配,这个优先级也是最高的。 ^~ :表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。 ~:表示区分大小写的正则匹配。 ~*:表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则 / 通用匹配,任何请求都会匹配到,默认匹配。 多个location配置的情况下匹配顺序为: 优先级=>^~> 说明:首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。 中括号可以不写任何参数,此时称为一般匹配。也可以写参数。 因此,大类可以分为3中。 Location=patt{}[精准匹配] Location patt{}[一般匹配] Location ~ patt{}[正则匹配] location的匹配过程: 总结:location的命中过程是这样子的 1:先判断精准命中,如果命中,立即返回结果并结束解析过程。 2:判断普通命中,如果有多个命中,”记录”下来”最长”的命中结果(注意:记录但不是结束,最长的为准) 3:继续判断正则表达式的解析过程,按配置里的正则表达式 为准,由上到下开始匹配,一旦匹配成功1个,立即返回结果,并结束解析过程。 延伸分析:A:普通命中,顺序无所谓,是因为按命中的长短来确定的。B:正则命中,顺序有所谓,因为是从前往后命中的。 精准匹配 首先看有没有精准匹配,如果有,则停止匹配过程。 Location = patt { ConfigA } 如果 $uri==patt,匹配成功,使用configA 举例说明: location = / { root /var/www/html/; index index.htm index.html; } location / { Root /usr/location/nginx/html; Index index.html index.htm; } 访问http://xxx.com/ 定位流程是: 1、 精准匹配中“/”,得到index也为 index.htm. 2、 再次访问/index.htm,此次内部跳转uri已经是”/index.htm”,更目录为/usr/local/nginx/html 3、最终结果为,访问到了/usr/local/nginx/html/index.htm 正则匹配 location / { root /usr/local/nginx/html; index index.html index.htm; } location ~ image { root /var/www/image; index index.html; } 此时如果我们访问http://xx.com/image/logo.png 此时,”/” 与”/image/logo.png”匹配 同时,“image”正则与”image/logo.png”也能匹配,谁发挥作用? 正则表达式成果将会使用。 图片真正访问/var/www/image/logo.png 普通匹配 location / { root /usr/local/nginx/html; index index.html index.htm; } location /foo { root /var/www/html; index index.html; } 我们访问 http://xxx.com/foo 对于uri “/foo”, 两个location的patt,都能匹配他们 即‘/’能从左前缀匹配‘/foo’, ‘/foo’也能左前缀匹配’/foo’, 此时, 真正访问 /var/www/html/index.html 原因:’/foo’匹配的更长,因此被使用