一個請求過來,nginx首先要判斷哪個server去處理這個請求,如果請求的監聽端口只包含在一個server里,請求會直接進到該server,如果多個server監聽了同一個端口,nginx會根據header頭中的Host去判斷使用哪個server來處理該請求。以下面的三個server配置為例:
server {
??? listen? ????80;
??? server_name example.org www.example.org;
??? ...
}
server {
??? listen????? 80;
??? server_name example.net www.example.net;
??? ...
}
server {
??? listen????? 80;
??? server_name example.com www.example.com;
??? ...
}
在該配置的情況下,nginx首先檢測header中的Host,匹配到哪個server中的server_name字段就路由到那個server,如果都沒有匹配,則采用默認路由,默認路由到第一個server,也可以通過在listen中配置default_server來指定默認server,具體配置如下:
server {
??? listen????? 80default_server;
??? server_name example.net www.example.net;
??? ...
}
在匹配到對應的server之后,再根據server中配置的location規則進行相應的轉發,location語法如下:
location [=|~|~*|^~] /uri/ { … }
=????????嚴格匹配。如果請求匹配這個location,那么將停止搜索并立即處理此請求
~????????區分大小寫匹配(可用正則表達式)
~*???????不區分大小寫匹配(可用正則表達式)
!~???????區分大小寫不匹配
!~*??????不區分大小寫不匹配
^~??????如果把這個前綴用于一個常規字符串,那么告訴nginx 如果路徑匹配那么不再匹配別的規則
Location匹配的優先級如下:
= 精確匹配會第一個被處理。如果發現精確匹配,nginx停止搜索其他匹配。
普通字符匹配,正則表達式規則和長的塊規則將被優先和查詢匹配,也就是說如果該項匹配還需去看有沒有正則表達式匹配和更長的匹配。
^~ 則只匹配該規則,nginx停止搜索其他匹配,否則nginx會繼續處理其他location指令。
最后匹配理帶有"~"和"~*"的指令,如果找到相應的匹配,則nginx停止搜索其他匹配;當沒有正則表達式或者沒有正則表達式被匹配的情況下,那么匹配程度最高的逐字匹配指令會被使用。舉例如下:
location = / {
??? [ config A ]
}
location / {
??? [ config B ]
}
location /documents/ {
??? [ config C ]
}
location ^~ /images/ {
??? [ config D ]
}
location ~* \.(gif|jpg|jpeg)$ {
??? [ config E ]
}
上述匹配規則中:
“/”會匹配到config A
“/index.html”會匹配到config B
”/documents/document.html”會匹配到config C
”/images/1.gif”會匹配到config D
“/documents/1.jpg”會匹配到config E