nginx的location, root, alias, proxy_pass

一直對nginx的location匹配順序處於一種似懂非懂的狀態,這次仔細閱讀了官方文檔後頓悟了,做此紀錄。

location

參考:location
location的匹配模式有五種:

location /abc{ #普通前綴匹配
	...
}
location ^~ /abc{ #不做正則的普通前綴匹配
	...
}
location = /abc{ #精準匹配
	...
}
location ~ /abc{ #大小寫敏感的正則匹配
	...
}
location ~* /abc{ #大小寫不敏感的正則匹配
	...
}

具體的匹配順序:

  1. 從上往下挨個匹配,滿足location = /xxx則結束匹配
  2. 嘗試普通前綴匹配,記錄匹配度最高的location,如果是^~模式的結束匹配,不是則不會結束匹配,繼續第三步
  3. 再次從上往下嘗試正則匹配,選擇第一個匹配成功的location,沒有找到匹配的正則location,選擇第二步記錄的location

root和alias

參考: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倆種情況:

  1. 自帶uri的,例如proxy_pass http://ip:port/abc/,會用自帶的uri替換原始uri根路徑
  2. 不帶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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章