- Published on
「Nginx 筆記」單一 Server 配置多個 location
- Authors
- Name
- Wen Chen
前言
最近在協助將公司CRA專案原本的 CI 透過docker容器化,打包出來的 image 要有 build 完的檔案以及透過 nginx serve 在指定 port。
因為專案本身還有其他路徑要指到特定的 html ,記錄下最後的解決方式。
Image 檔案結構
.
└── app
└── index.html
└── health
└── index.html
- 需求:app 資料夾底下的
index.html
為專案 react 入口,另外需要透過my-domain/health
直接進入到 health 資料夾底下的index.html
原本的 location 配置:
location / {
root /app;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
原本後端提供的配置雖運作正常,但無法直接透過 /health
進入另一個指定的 html ,需要完整輸入 /health/index.html
原本的嘗試
原本嘗試改成這樣:
location / {
root /app;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /health {
root /app/health; # 不能 work
index index.html index.htm;
}
後來發現結果不如預期,上網搜尋之後發現解釋眾說紛紜,底下提供幾種解決方法:
alias 指定目錄
location / {
root /app;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /health {
alias /app/health/;
index index.html index.htm;
}
透過 alias 指定目錄,直接將 /health
指定到 /app/health/
底下
alias 必須用 "/" 結尾,才找得到對應目錄
配置多個 root
後來閱讀文件之後發現:
root
的處理方式是:root 路徑 + location 路徑alias
的處理方式是:用 alias 路徑替換 location 路徑
這也可以說明最一開始寫的版本會錯,因為實際查找路徑會變成 /app/health/health
。
最後改成了:
location / {
root /app;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /health {
root /app;
}
又因為 root 默認會抓 index.html,所以把 index
的配置也拔掉了。
後記
因為本身對 nginx
相關設定也不是很熟悉,大部分資訊都是一邊嘗試一邊收集資料得來的,底下僅放上一些筆記做參考:
root
的處理方式是:root 路徑 + location 路徑alias
的處理方式是:用 alias 路徑替換 location 路徑alias
是目錄別名的定義,root
是最上層根目錄的定義root
可以不放在 location 內,alias
則僅能在 location 內- 使用
alias
定義目錄別名時必須以"/" 做結尾,才找得到指定目錄,root
則不用