一、location匹配规则
语法规则:
location [=|~|~*|^~] /uri/ { … }
=
精确匹配
~
区分大小写的正则匹配
~*
不区分大小写的正则匹配
^~
匹配uri前半部分。
location = /uri
=开头表示精确匹配,只有完全匹配上才能生效。
location ^~ /uri
^~ 开头对uri路径进行前缀匹配,并且在正则之前。
location ~ pattern
~开头表示区分大小写的正则匹配。
location ~* pattern
~*开头表示不区分大小写的正则匹配。
location /uri
不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
location /
通用匹配,任何未匹配到其它location的请求都会匹配到。
多个location配置的情况下匹配顺序为:
首先是=匹配,如果匹配成功,则停止其他匹配。其次是普通字符串匹配,顺序是从长到短,匹配成功的location如果使用^~,则停止其他匹配(正则匹配)。 其次正则表达式匹配,按照配置文件里的顺序,成功就停止其他匹配。最后是 / 通用匹配。
注意点:
匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。
例子,有如下匹配规则:
location = / { 规则A }
location = /login { 规则B }
location ^~ /static/ { 规则C }
location ~ \.(gif|jpg|png|js|css)$ { 规则D }
location ~* \.png$ { 规则E }
location !~ \.xhtml$ { 规则F }
location !~* \.xhtml$ { 规则G }
location / { 规则H }
那么产生的效果如下:
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C
访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML 不会匹配规则G,因为不区分大小写。