一、定義靜態文件的路徑的兩種方式
1.?root
?指令
(1)作用
-
指定文件系統的?基礎路徑,
location
?的 URI 會?追加到該路徑后?形成完整路徑。
(2)語法
location /uri/ {root /path/to/files;
}
(3)路徑解析規則
-
最終路徑 =?
root
?+?location
?URI
例如:location /static/ {root /var/www/html; }
-
請求?
/static/logo.png
?→ 服務器文件路徑:/var/www/html/static/logo.png
-
(4)特點
-
適用于?
location
?的 URI 需要作為子目錄?的情況。 -
默認會?自動拼接?
location
?和?root
。
(5)示例
server {listen 80;server_name example.com;location /images/ {root /data/website; # 訪問 /images/cat.jpg → /data/website/images/cat.jpg}
}
2.?alias
?指令
(1)作用
-
指定文件系統的?精確路徑,
location
?的 URI 會?被替換為該路徑。
(2)語法
location /uri/ {alias /path/to/files/;
}
(3)路徑解析規則
-
最終路徑 =?
alias
?+ (URI 去除?location
?前綴)
例如:location /assets/ {alias /var/www/static/; }
-
請求?
/assets/js/app.js
?→ 服務器文件路徑:/var/www/static/js/app.js
-
(4)特點
-
適用于?
location
?的 URI 需要映射到不同目錄?的情況。 -
必須以?
/
?結尾(否則可能拼接異常)。 -
不會自動拼接?
location
?路徑,而是直接替換。
(5)示例
server {listen 80;server_name example.com;location /static/ {alias /data/shared/; # 訪問 /static/logo.png → /data/shared/logo.png}
}
二、核心區別對比
特性 | root | alias |
---|---|---|
路徑拼接方式 | root + location | 替換?location ?為?alias |
結尾斜杠?/ | 可省略 | 必須包含(如?/data/ ) |
適用場景 | URI 是文件子目錄(如?/img/ ) | URI 需要映射到其他目錄 |
性能影響 | 無差異 | 無差異 |
三、常見問題與注意事項
1. 結尾斜杠問題
-
alias
?必須明確以?/
?結尾,否則路徑解析會出錯:# 錯誤示例(缺少 /) location /static {alias /data/static; # 請求 /static/file → 可能解析為 /data/staticfile }# 正確示例 location /static/ {alias /data/static/; # 請求 /static/file → /data/static/file }
2. 正則匹配?location
-
如果?
location
?使用正則表達式(如?~* \.(jpg|png)$
),必須用?alias
,因為?root
?不支持正則替換。
3. 安全性
-
避免將?
alias
?指向敏感目錄(如?/etc/
),否則可能引發安全問題。
四、示例場景
場景 1:普通靜態資源
# 使用 root(URI 是子目錄)
location /uploads/ {root /var/www/site; # 文件路徑:/var/www/site/uploads/file.txt
}# 使用 alias(URI 需要重映射)
location /docs/ {alias /mnt/shared/documents/; # 文件路徑:/mnt/shared/documents/file.txt
}
場景 2:單頁應用(SPA)
location / {root /var/www/app/dist;try_files $uri $uri/ /index.html; # Vue/React 路由支持
}
五、完整案例
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 600;client_header_timeout 600;client_body_timeout 600;#上傳文件的大小限制 默認1mclient_max_body_size 10m;underscores_in_headers on;server {# 訪問端口listen 8080;server_name localhost;location / {root D:/Users/22972/work/nginx-1.23.3/web/dist/;index index.html index.htm;}location ^~/api/auth/ {proxy_pass http://192.168.0.125:8081/auth/;}# 后端線上服務代理location /api/system/ {proxy_pass http://192.168.0.125/api/system/;}# 前端子應用代理location /system-ui/ {proxy_pass http://localhost:8001/system-ui/;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}