一直對nginx的location匹配順序處於一種似懂非懂的狀態,這次仔細閱讀了官方文檔後頓悟了,做此紀錄。
location
參考:location
location的匹配模式有五種:
location /abc{ #普通前綴匹配
...
}
location ^~ /abc{ #不做正則的普通前綴匹配
...
}
location = /abc{ #精準匹配
...
}
location ~ /abc{ #大小寫敏感的正則匹配
...
}
location ~* /abc{ #大小寫不敏感的正則匹配
...
}
具體的匹配順序:
- 從上往下挨個匹配,滿足
location = /xxx
則結束匹配 - 嘗試普通前綴匹配,記錄匹配度最高的location,如果是
^~
模式的結束匹配,不是則不會結束匹配,繼續第三步 - 再次從上往下嘗試正則匹配,選擇第一個匹配成功的location,沒有找到匹配的正則location,選擇第二步記錄的location
root和alias
location /aaa/bbb/ {
...
}
如果把/aaa/bbb/
定義爲uri根路徑,那麼使用root會在document path後面加上uri根路徑,而alias不會。
proxy_pass
參考:proxy_pass
location /abc/ {
proxy_pass http://ip:port[URI];
}
這裏的proxy_pass是ngx_http_proxy_module模塊裏的,要求後面跟上一個URL,協議可選http或https,最後面的URI可選。
如果把/abc/
部分定義爲原始uri根路徑,那麼proxy_pass就分爲自帶uri和不帶uri倆種情況:
- 自帶uri的,例如
proxy_pass http://ip:port/abc/
,會用自帶的uri替換原始uri根路徑 - 不帶uri的,例如
proxy_pass http://ip:port
,會使用完整的原始uri
舉幾個簡單的例子:
原始訪問地址:http://129.1.1.1/abc/a.html 進行訪問。
location /abc/ {
proxy_pass http://127.0.0.1/;
}
原始uri根路徑'/abc/',自帶的uri是'/', 代理URL:http://127.0.0.1/a.html
location /abc/ {
proxy_pass http://127.0.0.1;
}
不自帶uri,代理URL:http://127.0.0.1/abc/a.html
location /abc/ {
proxy_pass http://127.0.0.1/qqq/;
}
原始uri根路徑'/abc/',自帶uri是'/qqq/',代理URL:http://127.0.0.1/qqq/a.html