總原則:先前綴字符串,再正則表達式。
不管配置文件中的location順序怎么寫,在匹配時,都會先將所有前綴字符串拎出來,放在第一位;然后再去找所有正則表達式,作為第二位。
1、首先匹配前綴字符串。前綴字符串有以下幾種形式(舉例):
a、location = /data/ {}
b、location ^~ /data/ {}
c、location /data/ {}
2、然后匹配正則表達式。正則表達式的幾種形式(舉例):
d、location ~ \.html? {}
e、location ~* \.html? {}
a的權限最大,一旦匹配到,立即停止,直接使用對應的location。
b的權限次之,一旦匹配到,就不再檢查正則表達式。相當於打斷了后續。
c如果匹配到了,不會立即停止,而是會先將它存儲起來,然后繼續往下匹配。
d如果匹配到了,立即停止,直接使用對應的location;
d如果沒有匹配,繼續往下找。
e如果匹配到了,立即停止,直接使用對應的location;
e如果沒有匹配,就使用先前存儲的那個前綴字符串。
也就是說,location /data/ {}這種模式是等級最低的。實在匹配不到了,才勉強使用它。
前提是我們配置了a、b、c、d、e這五個location。
如果只配置了a、b、c,就沒有正則匹配什么事了;
如果只配置了d、e,就沒有前綴匹配什么事了。
那么什么叫最長匹配呢?
一個請求為:http://www.example.com/images/a.png
對於/images/a.png這個URI來說,上面的2個location中,location /images/是最長匹配。雖然location /也能匹配,但不是最長的。
由於不是精確匹配,nginx此時會先將這個最長匹配保存起來。
如果后面配置了正則表達式,那么nginx會繼續向下匹配正則表達式。
如果后面沒有配置正則表達式,nginx就會使用剛才保存的最長的那個前綴匹配,也就是location /images/對應的地方。