---
title: 路径前缀必读
description: base=/docs/ 导致的部署白屏问题与三种正确做法
outline: deep
---
# 路径前缀必读
这是本项目最容易出错的地方,**部署失败九成是这个原因**。部署前请务必读完本页。
## 问题成因
文档站配置里 `base: '/docs/'`(见 `.vitepress/config.mts`),因此构建产物中所有资源引用都是**绝对路径**:
```html
```
而产物目录 `.vitepress/dist` 是**平铺**的,`index.html`、`assets/` 直接在根,**没有 `docs/` 子目录**。
由此推出两条铁律:
1. **对外访问路径必须是 `/docs/`**,且服务器必须把 `/docs/` 前缀剥掉后再落到产物目录
2. 若想挂到别的前缀(如 `/manual/`),必须**先改 `base` 再重新构建**,不能只改服务器配置
::: warning 典型故障:白屏
如果配置成「从根路径直接服务产物」(`root` 指向 dist,访问 `/`),页面 HTML 会返回 200,但 `/docs/assets/*.js` 全部 404 → **浏览器白屏,没有任何报错提示**。
这种情况最坑的地方是:`curl /` 返回 200,看起来部署成功了,实际打开浏览器是空白页。
:::
## 三种正确做法
| 做法 | 适用 | 关键配置 |
| --- | --- | --- |
| nginx `alias` 剥前缀 | 容器部署(推荐) | `location /docs/ { alias /usr/share/nginx/html/; }` |
| 把产物放进 `docs/` 子目录 | 静态托管 / 对象存储 | `dist/` → `www/docs/` |
| 改 `base: '/'` 重新构建 | 独占域名根路径 | 改配置后必须重新 `npm run build` |
### 做法一:nginx alias 剥前缀
```nginx
location /docs/ {
alias /usr/share/nginx/html/;
try_files $uri $uri.html $uri/ $uri/index.html =404;
}
```
`alias` 会剥掉 `location` 的前缀,`/docs/assets/app.js` 实际读到 `/usr/share/nginx/html/assets/app.js`,正好对上平铺的产物目录。
详见 [推荐环境部署:Docker + nginx](./docker-nginx)。
### 做法二:产物放进 docs 子目录
```bash
sudo cp -r .vitepress/dist /var/www/iotlcm/www/docs
```
```nginx
root /var/www/iotlcm/www;
location /docs/ {
try_files $uri $uri.html $uri/ $uri/index.html =404;
}
```
`/docs/assets/app.js` 自然映射到 `/var/www/iotlcm/www/docs/assets/app.js`,不需要 `alias`。
详见 [静态托管部署](./static-hosting)。
### 做法三:改 base 重新构建
```bash
sed -i "s#base: '/docs/'#base: '/'#" .vitepress/config.mts
npm run build
```
仅适用于文档站独占域名根路径的场景。
::: danger 不要只改服务器配置
`base` 与访问前缀必须一致。改了 nginx 却不改 `base`(或反之),一定会白屏。
:::
## cleanUrls 的额外要求
配置启用了 `cleanUrls: true`,页面 URL 不带 `.html` 后缀(如 `/manual/web/` 而非 `/manual/web.html`)。
因此服务器的 `try_files` **必须**包含 `$uri.html` 与 `$uri/index.html` 映射:
```nginx
try_files $uri $uri.html $uri/ $uri/index.html =404;
```
缺了这两项的表现是:首页正常,但点进任何内页都是 404。
对象存储场景下需确认支持「无后缀映射到 `.html`」,否则要关闭 `cleanUrls` 重新构建。