最近剛好幫一位同事解決一個關於nginx靜態資源配置的小問題。雖然很小,但是還是琢磨了許久,不是nginx坑了我,就是我太菜了。哈哈,想著還是把這點小知識記錄下來,後期遇到同樣的問題可以提高效率。
一、先看小需求
需求很簡單,大致就是:當url中以/res
為字首時,表示該請求是靜態資源請求,並將其重定向到靜態資源路徑去拿靜態資源。
舉個例子:
當訪問路徑是:http://127.0.0.1:8080/res/風景.jpg
時,此時nginx應該返回一張美麗的風景圖片.
二、nginx配置
這是一個再簡單不過的需求了,使用nginx的配置如下:
location /res/ {
root f:/res/;
}
複製程式碼
當匹配/res/
字首時,訪問f:/res/
目錄下的靜態資原始檔。圖片"風景.jpg"存放在f:/res/
目錄下。
啟動nginx後發現下面請求顯示404
http://localhost/res/風景.jpg
檢視日誌後發現,nginx實際上找的是f:/res/res/風景.jpg
這個路徑下的圖片,但由於f:/res/res/
沒有這個圖片當然報404啦!
現在我們將上面的nginx配置改成:
location /res/ {
alias f:/res/;
}
複製程式碼
啟動nginx後發現下面請求正常顯示圖片。
http://localhost/res/風景.jpg
檢視日誌後發現,nginx實際上找的是f:/res/風景.jpg
這個路徑下的圖片,但由於f:/res/
有這個圖片當然不報404啦!
三、結論
alias
和root
指令的區別就是:
-
1、
root
不會將location
配置的路徑去掉 也就是請求http://localhost/res/xxx
,不會忽略localhost
的配置,反而會加在root
配置的路徑後面,變成f:/res/res/xxx
-
2、
alias
會將location
配置的路徑去掉
也就是請求http://localhost/res/xxx
,會忽略localhost
的配置,不會加在alias
配置的路徑後面,變成f:/res/xxx
,location
的/res/
被忽略了。
最後,不要在postman上面訪問中文名稱的請求,比如http://localhost/res/風景.jpg
,由於postman不支援中文,永遠都會顯示404,不然你會說為什麼明明配置對了,在postman還不生效,哈哈,最後懷疑人生。