---
author: Peanut
created_at: 2026-06-28
purpose: 修复生产环境首页 404，删除 nginx 配置中显式阻断根路径的 location 块
---

# 修复 nginx 根路径 404 设计

## 背景

生产环境 `https://lifescript.happylifeos.com/` 访问首页返回 404 Not Found，但：
- 前端文件 `/data/www/emotion-museum/index.html` 实际已正确部署
- 子路径 `https://lifescript.happylifeos.com/emotion-museum-admin/`、`/life-script/`、`/emotion-museum/` 可以正常访问
- 后端 API 代理 `/api` 正常工作

## 根因（实际）

**真实生效的 nginx 配置不在 `conf/emotion-museum.conf`**，而是在 aaPanel 托管的：
`/www/server/panel/vhost/nginx/emotion-museum.conf`

原因：nginx 主配置 `/www/server/nginx/conf/nginx.conf` 的 include 顺序是：
```nginx
include /www/server/panel/vhost/nginx/*.conf;
```
它只 include aaPanel 的 vhost 目录。`/etc/nginx/sites-available/` 是部署脚本的"期望"路径，但**从未被 include**，所以 `deploy.py nginx` 实际上一直没真正生效。

真实配置中第 31-33 行有一个显式阻断根路径的 exact match：

```nginx
location = / {
    return 404;
}
```

并且前端在真实配置中映射的路径是 `/emotion-museum/`（不是根路径）：

```nginx
location /emotion-museum/ {
    alias /data/www/emotion-museum/;
    ...
    try_files $uri $uri/ /emotion-museum/index.html;
}
```

所以访问 `/` 时，被 `location = / { return 404; }` 精确匹配拦截，根本不会走到任何 location 块。

## 修复方案

### 第一层：修改真实生效的 aaPanel 配置

直接 ssh 编辑 `/www/server/panel/vhost/nginx/emotion-museum.conf`，把：

```nginx
location = / {
    return 404;
}
```

改成：

```nginx
location = / {
    rewrite ^ /emotion-museum/ permanent;
}
```

这样根路径会被 301 永久重定向到 `/emotion-museum/`（前端实际部署位置）。

然后 `nginx -t && nginx -s reload` 让配置生效。

### 第二层：同步更新仓库内 `conf/emotion-museum.conf`

保持仓库内的配置文件与真实服务器一致（作为基线参考）。同步修改：
1. 删除之前的 `location / { alias /data/www/emotion-museum/; ... }` 通用块（真实配置没有）
2. 新增 `location /emotion-museum/ { ... }` 前端块（与真实配置对齐）
3. `location = /` 改为 `rewrite ^ /emotion-museum/ permanent;`

**注意**：虽然仓库内配置现在不被真实 nginx include，但保持同步是为了：
- 作为文档，记录服务器实际配置
- 未来如果切回 sites-available 部署模式，能直接生效
- 避免"仓库配置"和"服务器配置"分叉导致混乱

## 验证步骤

1. ssh 直接编辑服务器上的 `/www/server/panel/vhost/nginx/emotion-museum.conf`，改 `location = /` 块
2. `nginx -t` 验证语法
3. `nginx -s reload` 重载配置
4. 浏览器访问 `https://lifescript.happylifeos.com/` 确认 301 → `https://lifescript.happylifeos.com/emotion-museum/`
5. `/emotion-museum/` 正常返回前端页面（200）
6. DevTools Network 无 404、Console 无报错
7. 其他子路径（`/emotion-museum-admin/`、`/life-script/`、`/api/`、`/ws`、`/health`）不受影响
8. 同步更新 `conf/emotion-museum.conf` 作为仓库基线
9. 提交 git commit

## 风险与回退

- **影响面小**：只改 1 个 location 块（3 行），其他 location 块完全不动
- **回退方案**：若出问题，把 `rewrite ^ /emotion-museum/ permanent;` 改回 `return 404;` 即可立即回滚
- **不会冲突**：`/emotion-museum/`、`/emotion-museum-admin/`、`/life-script/` 都有自己的 location 块，`location = /` 精确匹配只对根路径生效

## 长期改进（不在本次范围）

`deploy.py nginx` 当前部署到 `/etc/nginx/sites-available/`，但服务器主配置 include 的是 aaPanel 路径，所以部署脚本实际上一直无效。后续应该：
- 让 `deploy.py nginx` 同时更新 `/www/server/panel/vhost/nginx/emotion-museum.conf`
- 或者在 nginx 主配置中增加 `include /etc/nginx/sites-enabled/*.conf;`
- 本次不处理，单独跟踪
