Nginx location靜態(tài)文件映射配置過(guò)程
遇到問(wèn)題?
以下這個(gè)Nginx的配置,愿意為訪問(wèn)https://abc.com會(huì)指向一個(gè)動(dòng)態(tài)網(wǎng)站,訪問(wèn)https://abc.com/tongsongzj時(shí)會(huì)訪問(wèn)靜態(tài)網(wǎng)站,但是配置之后(注意看后面那個(gè)location /tongsongzj/靜態(tài)文件映射的配置),此時(shí)不能通過(guò)https://abc.com/tongsongzj/index.html正確訪問(wèn),顯示報(bào)錯(cuò)信息如下:

問(wèn):這是為啥?需要如何修改?
已經(jīng)確認(rèn)前端代碼在宿主機(jī)路徑/opt/docker-data/nginx/h5下,且對(duì)應(yīng)的docker中nginx容器真實(shí)路徑為/usr/share/nginx/h5。
Nginx配置如下
# ABC官網(wǎng)Nginx配置
# 這里跳轉(zhuǎn)到動(dòng)態(tài)網(wǎng)站
server {
listen 80; # 監(jiān)聽(tīng)80端口,用于HTTP請(qǐng)求
# listen 443 ssl; # 監(jiān)聽(tīng)443端口,用于HTTPS請(qǐng)求,并啟用SSL
listen 443 ssl http2; # 啟用 HTTP/2 的 HTTPS 監(jiān)聽(tīng)
server_name www.abc.com abc.com; # 綁定的域名
root html;
index index.html index.htm;
# SSL證書(shū)和私鑰的路徑
ssl_certificate conf.d/cert/abc.pem;
ssl_certificate_key conf.d/cert/abc.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的類型。
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS協(xié)議的類型。
ssl_prefer_server_ciphers on;
location / {
#root html; #Web網(wǎng)站程序存放目錄。
#index index.html index.htm;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://abc-cms:9999;
# proxy_pass http://172.19.19.80:8082;
}
# 靜態(tài)頁(yè)面配置,代碼傳到/opt/docker-data/nginx/h5路徑即可
location /tongsongzj/ {
# 靜態(tài)網(wǎng)頁(yè)配置
root /usr/share/nginx/h5; # 靜態(tài)網(wǎng)頁(yè)的根目錄
index index.html; # 默認(rèn)打開(kāi)的文件
try_files $uri $uri/ /index.html; # 嘗試查找URI對(duì)應(yīng)的文件,否則返回index.html
# 禁用緩存
expires off;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
}
}
問(wèn)題解決
靜態(tài)文件無(wú)法訪問(wèn)的原因在于路徑拼接方式錯(cuò)誤。
以下是詳細(xì)分析和解決方案:
問(wèn)題分析:路徑拼接邏輯錯(cuò)誤
當(dāng)前配置中使用了 root 指令:
location /tongsongzj/ {
root /usr/share/nginx/h5; # 最終路徑 = root + location
...
}
Nginx 會(huì)將 location 路徑拼接到 root 后面,因此實(shí)際訪問(wèn)路徑為:
/usr/share/nginx/h5/tongsongzj/index.html
但根據(jù)你的描述,靜態(tài)文件直接存放在容器的 /usr/share/nginx/h5 路徑下(對(duì)應(yīng)宿主機(jī) /opt/docker-data/nginx/h5),并未創(chuàng)建 tongsongzj 子目錄,導(dǎo)致路徑不匹配。
解決方案:改用 alias 指令
將 root 改為 alias 指令,并直接指向靜態(tài)文件的實(shí)際路徑:
location /tongsongzj/ {
alias /usr/share/nginx/h5/; # 直接映射路徑,不拼接 location
index index.html;
try_files $uri $uri/ /tongsongzj/index.html; # 修正回退路徑
# 禁用緩存配置
expires off;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
}
關(guān)鍵修改說(shuō)明:
alias會(huì)直接將/tongsongzj/映射到容器內(nèi)的/usr/share/nginx/h5/目錄,不再拼接location路徑。- 修正
try_files確?;赝说?/tongsongzj/index.html,避免路徑錯(cuò)誤。
其他注意事項(xiàng)
1.確認(rèn)文件路徑:
確保容器內(nèi) /usr/share/nginx/h5 路徑下直接存在 index.html 等靜態(tài)文件,而不是嵌套在子目錄中。
2.檢查目錄權(quán)限:
運(yùn)行以下命令確保 Nginx 有權(quán)限訪問(wèn)該目錄:
docker exec [nginx容器名] ls -l /usr/share/nginx/h5
如果權(quán)限不足,嘗試在宿主機(jī)執(zhí)行:
chmod -R 755 /opt/docker-data/nginx/h5
3.檢查 Nginx 日志:
查看錯(cuò)誤日志定位具體原因:
docker logs [nginx容器名] 2>&1 | grep -i error
完整修正配置參考
# 靜態(tài)頁(yè)面配置
location /tongsongzj/ {
alias /usr/share/nginx/h5/; # 使用 alias 直接映射真實(shí)路徑
index index.html;
try_files $uri $uri/ /tongsongzj/index.html; # 保持前端路由正常
# 禁用緩存
expires off;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
}
或者
# 靜態(tài)頁(yè)面配置,代碼傳到 /opt/docker-data/nginx/h5/tongsongzj 路徑即可
# 說(shuō)明:使用root指令,Nginx 會(huì)將 location 路徑拼接到 root 后面,因此實(shí)際訪問(wèn)路徑為:/usr/share/nginx/h5/tongsongzj/index.html
location /tongsongzj/ {
# 靜態(tài)網(wǎng)頁(yè)配置
root /usr/share/nginx/h5; # 靜態(tài)網(wǎng)頁(yè)的根目錄 【最終路徑 = root + location】
index index.html; # 默認(rèn)打開(kāi)的文件
try_files $uri $uri/ /index.html; # 嘗試查找URI對(duì)應(yīng)的文件,否則返回index.html
# 禁用緩存
expires off;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
}
修改后重啟 Nginx 服務(wù)即可生效:
docker exec [nginx容器名] nginx -s reload
root和alias的核心區(qū)別
Nginx 的 root 和 alias 指令都用于定義靜態(tài)文件的路徑映射,但它們的路徑拼接邏輯完全不同。理解它們的區(qū)別是避免配置錯(cuò)誤的關(guān)鍵。
1.root指令
定義
- 路徑拼接邏輯:
root會(huì)將location的 URI 路徑拼接到root指定的路徑后面。 - 適用場(chǎng)景:當(dāng) URI 路徑和文件系統(tǒng)的目錄結(jié)構(gòu)完全一致時(shí)(例如
/static/對(duì)應(yīng)/var/www/static/)。
示例
location /static/ {
root /var/www;
}
當(dāng)訪問(wèn) /static/image.jpg 時(shí),Nginx 會(huì)查找文件:
/var/www/static/image.jpg
(路徑 = root + location 的 URI)
優(yōu)點(diǎn)
- 簡(jiǎn)單直觀:URI 路徑和文件路徑一一對(duì)應(yīng),適合標(biāo)準(zhǔn)目錄結(jié)構(gòu)。
- 自動(dòng)處理子路徑:支持嵌套路徑(如
/static/css/style.css)。
缺點(diǎn)
- 路徑強(qiáng)制拼接:無(wú)法靈活映射到與 URI 不匹配的目錄結(jié)構(gòu)。
- 冗余路徑:如果 URI 路徑和實(shí)際目錄結(jié)構(gòu)不匹配,會(huì)導(dǎo)致路徑錯(cuò)誤。
注意事項(xiàng)
- 確保
root路徑的末尾沒(méi)有斜杠(例如/var/www,而不是/var/www/)。 - 如果
location路徑是/static/,實(shí)際文件必須存放在root路徑下的static子目錄中。
2.alias指令
定義
- 路徑拼接邏輯:
alias會(huì)用指定的路徑完全替換location的 URI 路徑。 - 適用場(chǎng)景:當(dāng) URI 路徑和實(shí)際文件路徑不一致時(shí)(例如將
/docs/映射到/usr/share/nginx/html)。
示例
location /docs/ {
alias /usr/share/nginx/html/;
}
當(dāng)訪問(wèn) /docs/readme.html 時(shí),Nginx 會(huì)查找文件:
/usr/share/nginx/html/readme.html
(路徑 = alias 路徑 + URI 去除 location 前綴后的部分)
優(yōu)點(diǎn)
- 靈活映射:可以自由將 URI 映射到任意目錄結(jié)構(gòu)。
- 無(wú)冗余路徑:URI 路徑和文件路徑完全解耦。
缺點(diǎn)
- 路徑易錯(cuò):必須嚴(yán)格處理斜杠(
/),否則會(huì)導(dǎo)致路徑拼接錯(cuò)誤。 - 不支持自動(dòng)子路徑:需要手動(dòng)處理嵌套路徑。
注意事項(xiàng)
alias路徑的末尾必須帶斜杠(例如/usr/share/nginx/html/)。location的路徑末尾必須帶斜杠(例如/docs/而不是/docs),否則路徑替換可能不完整。
關(guān)鍵對(duì)比表格
| 特性 | root | alias |
|---|---|---|
| 路徑拼接邏輯 | root + location URI | 用 alias 完全替換 location URI |
| 斜杠處理 | root 路徑末尾不帶斜杠 | alias 路徑末尾必須帶斜杠 |
| 適用場(chǎng)景 | URI 與文件路徑一致 | URI 與文件路徑不一致 |
| 嵌套路徑支持 | 自動(dòng)支持(如 /static/css/) | 需手動(dòng)處理(依賴 try_files) |
| 常見(jiàn)錯(cuò)誤 | 文件路徑多了一層子目錄 | 路徑拼接錯(cuò)誤(斜杠問(wèn)題) |
常見(jiàn)錯(cuò)誤場(chǎng)景與修復(fù)
錯(cuò)誤 1:路徑多了一層子目錄
錯(cuò)誤配置(使用 root):
location /tongsongzj/ {
root /usr/share/nginx/h5;
index index.html;
}
- 預(yù)期路徑:
/usr/share/nginx/h5/index.html - 實(shí)際路徑:
/usr/share/nginx/h5/tongsongzj/index.html(多了一層tongsongzj)
修復(fù)方法:改用 alias:
location /tongsongzj/ {
alias /usr/share/nginx/h5/; # 注意末尾斜杠
index index.html;
}
錯(cuò)誤 2:斜杠缺失導(dǎo)致路徑拼接錯(cuò)誤
錯(cuò)誤配置:
location /docs {
alias /usr/share/nginx/html; # 缺少末尾斜杠
}
- 訪問(wèn)
/docs/readme.html時(shí),路徑變?yōu)?/usr/share/nginx/htmlreadme.html(斜杠缺失導(dǎo)致拼接錯(cuò)誤)。
修復(fù)方法:
location /docs/ { # location 末尾加斜杠
alias /usr/share/nginx/html/; # alias 末尾加斜杠
}
最佳實(shí)踐
1.優(yōu)先使用 root:
- 如果 URI 路徑和文件目錄結(jié)構(gòu)完全一致(例如
/static/對(duì)應(yīng)/var/www/static/),使用root更簡(jiǎn)單。
2.必須用 alias 的場(chǎng)景:
- 當(dāng)需要將 URI 映射到一個(gè)與 URI 路徑不匹配的目錄時(shí)(例如將
/legacy/映射到/old-site/)。
3.嚴(yán)格處理斜杠:
location和alias的路徑末尾必須同時(shí)帶斜杠或不帶斜杠,且邏輯一致。- 推薦統(tǒng)一在
location和alias路徑末尾加斜杠。
4.結(jié)合 try_files 處理前端路由:
- 如果是單頁(yè)應(yīng)用(如 Vue/React),需配置
try_files回退到入口文件:
location /tongsongzj/ {
alias /usr/share/nginx/h5/;
try_files $uri $uri/ /tongsongzj/index.html; # 回退到 index.html
}
5.檢查文件權(quán)限:
確保 Nginx 進(jìn)程有權(quán)限讀取目錄和文件:
chmod -R 755 /opt/docker-data/nginx/h5 # 宿主機(jī)路徑
總結(jié)
root:路徑拼接簡(jiǎn)單,適合標(biāo)準(zhǔn)目錄結(jié)構(gòu)。alias:路徑替換靈活,適合自定義映射。
核心區(qū)別在于路徑拼接邏輯,務(wù)必通過(guò)實(shí)際文件路徑驗(yàn)證配置。
配置完成后,使用 nginx -t 測(cè)試語(yǔ)法,并通過(guò)日志排查錯(cuò)誤:
tail -f /var/log/nginx/error.log
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx部署JavaWeb項(xiàng)目全過(guò)程
這篇文章主要介紹了Nginx部署JavaWeb項(xiàng)目全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
通過(guò)瀏覽器查看nginx服務(wù)器狀態(tài)配置方法
這篇文章主要介紹了通過(guò)瀏覽器查看nginx服務(wù)器狀態(tài)配置方法,本文講解開(kāi)啟nginx-status的配置方法,并對(duì)服務(wù)器的參數(shù)做了詳細(xì)講解,需要的朋友可以參考下2015-04-04
一篇文章快速掌握Nginx部署前端項(xiàng)目(Nginx安裝配置及部署都非常詳細(xì)!)
這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章快速掌握Nginx部署前端項(xiàng)目的相關(guān)資料,文中從Nginx安裝配置及部署都非常詳細(xì)哦,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-01-01
Nginx配置SSL證書(shū)監(jiān)聽(tīng)443端口
這篇文章主要為大家詳細(xì)介紹了Nginx配置SSL證書(shū)監(jiān)聽(tīng)443端口的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
一些優(yōu)化Nginx服務(wù)器的技巧簡(jiǎn)介
這篇文章主要介紹了一些優(yōu)化Nginx服務(wù)器的技巧簡(jiǎn)介,包括對(duì)HTTP模塊和Events模塊的配置建議,需要的朋友可以參考下2015-06-06
通過(guò)nginx實(shí)現(xiàn)訪問(wèn)服務(wù)器指定目錄下圖片資源
這篇文章為大家詳細(xì)主要介紹了如何通過(guò)nginx實(shí)現(xiàn)訪問(wèn)服務(wù)器指定目錄下圖片資源,文中通過(guò)圖文進(jìn)行了詳細(xì)的講解,有需要的小伙伴可以了解下2023-10-10

