在 Nginx 中,try_files
是一個極為實用的指令,主要用于 按順序檢查文件或路徑是否存在,并返回第一個匹配到的資源或執行備用操作。它常見于 server
或 location
塊中,尤其在單頁應用(SPA)、靜態資源服務和 URL 重寫等場景下發揮關鍵作用,語法如下:location / {
try_files file1 file2 ... fallback;
}
1、檢查靜態資源是否存在,不存在返回abc目錄下默認文件index.html,查看nginx配置文件,如圖:
上述配置理解為:如果默認情況下什么路由都不加,那么請求到abc/index.html,如果請求的時候加了一個路由,比如 “ip/about.txt”,那么首先會查找abc路徑下是否有about.txt文件,此時about.txt對應的就是"$uri",如果沒有找到about.txt,那么繼續查找abc路徑下是否有about.txt目錄,這個about.txt目錄對應的就是”$uri/” ,如果有,那么就請求about.txt目錄的內容,如果也沒有這個目錄,那么就返回默認的頁面,也就是最開始的abc/index.html注:找about.txt目錄下的文件默認也是index.html(1)、如果什么路徑都不加,直接使用IP訪問,默認會找到abc下的index.html,如圖:(2)、在abc目錄下定義about.txt目錄,在此目錄下定義index.html文件,寫入內容,通過ip/about.txt訪問,如圖:注:因為abc目錄下沒有about.txt文件,但是有about.txt目錄,因此跳過$uri,繼續找$uri/,找到了并返回結果(3)、在abc目錄下定義test.txt文件,寫入內容,此時通過ip/test.txt訪問,如圖:此時符合了第一個$uri,因此不會繼續向后面查找了(4)、直接通過ip請求未知的資源路徑,ip/gong.doc,回到了默認頁面,如圖:因為abc路徑下不存在gong.doc也不存在這個目錄,因此就會找到最終的/index.html2、檢查靜態文件是否存在,不存在則轉發到后端應用,源nginx的配置,如圖:上圖中的配置可以理解為如果請求的路由不匹配$uri和$uri/,那么會轉發到@backend的后端服務,這個backend名稱是自定義的,因此如果請求http://192.168.49.83/test_route的時候,但是本地沒有對應的匹配,因此會轉發到http://192.168.49.224/test_route,這個test_route會帶到后端去的(1)、修改49.224的nginx配置文件,添加內容如圖:注:在后端的nginx配置中,也要有這個test_route路由,否則會報404錯誤(2)、在/data/html目錄下新建test_route目錄并定義index.html文件,如圖:(3)、此時通過源IP來請求test_route路由,因為當前沒有匹配,就會跳轉到后端服務去,如圖:add_header X-Tried-File $uri always;
此參數的意思是在 HTTP 響應頭 中新增一個自定義頭字段 X-Tried-File
,其值為 用戶實際請求的文件路徑(即 $uri
變量),查看響應頭信息,可以看到X-Tried-File,如圖:3、檢查靜態文件是否存在,不存在直接返回404,如圖:請求gong.txt,既不存在此文件也不存在此目錄,因此直接返回404,如圖:4、訪問頁面,直接返回狀態碼,適合維護頁面,如圖:在abc目錄下定義maintenace.html(名字要與nginx配置名字一致),然后通過192.168.49.83請求,如圖:上面配置理解為:如果請求/hello,那么匹配/custom/hello,如果匹配不到就繼續匹配/default/hello,如果都匹配不到就返回404(1)、在abc目錄下新建custom目錄并在內部創建gong.txt文件,新建default目錄并在內部新建guan.txt,通過url請求,如圖:
閱讀原文:原文鏈接
該文章在 2025/8/15 12:36:28 編輯過