Wen Chen
Published on

「Nginx 筆記」單一 Server 配置多個 location

Authors
  • avatar
    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 相關設定也不是很熟悉,大部分資訊都是一邊嘗試一邊收集資料得來的,底下僅放上一些筆記做參考:

  1. root 的處理方式是:root 路徑 + location 路徑
  2. alias 的處理方式是:用 alias 路徑替換 location 路徑
  3. alias 是目錄別名的定義,root 是最上層根目錄的定義
  4. root 可以不放在 location 內,alias 則僅能在 location 內
  5. 使用 alias 定義目錄別名時必須以"/" 做結尾,才找得到指定目錄,root 則不用