|
|
|
|
|
# 前端路由刷新404问题解决方案
|
|
|
|
|
|
|
|
|
|
|
|
## 问题描述
|
|
|
|
|
|
使用 Vue Router 的 `history` 模式时,当用户直接访问或刷新非根路径的页面时(如 `http://xiyan.cxmom.com/board/kanban`),服务器会返回 404 错误。
|
|
|
|
|
|
|
|
|
|
|
|
这是因为浏览器会向服务器请求该路径,但服务器上并没有这个实际的文件或目录。
|
|
|
|
|
|
|
|
|
|
|
|
## 解决方案
|
|
|
|
|
|
|
|
|
|
|
|
根据你使用的 Web 服务器,选择相应的配置:
|
|
|
|
|
|
|
|
|
|
|
|
### 1. Nginx 配置
|
|
|
|
|
|
|
|
|
|
|
|
将 `nginx.conf` 文件中的配置添加到你的 Nginx 配置中。
|
|
|
|
|
|
|
|
|
|
|
|
**关键配置**:
|
|
|
|
|
|
```nginx
|
|
|
|
|
|
location / {
|
|
|
|
|
|
try_files $uri $uri/ /index.html;
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
这个配置的含义是:
|
|
|
|
|
|
- 首先尝试找到请求的文件(`$uri`)
|
|
|
|
|
|
- 如果不存在,尝试找到对应的目录(`$uri/`)
|
|
|
|
|
|
- 如果都不存在,返回 `index.html`,由 Vue Router 处理路由
|
|
|
|
|
|
|
|
|
|
|
|
**完整配置示例**见 `nginx.conf` 文件。
|
|
|
|
|
|
|
|
|
|
|
|
### 2. Apache 配置
|
|
|
|
|
|
|
|
|
|
|
|
将 `.htaccess` 文件复制到你的 `dist` 目录根目录下。
|
|
|
|
|
|
|
|
|
|
|
|
**关键配置**:
|
|
|
|
|
|
```apache
|
|
|
|
|
|
RewriteCond %{REQUEST_FILENAME} !-f
|
|
|
|
|
|
RewriteCond %{REQUEST_FILENAME} !-d
|
|
|
|
|
|
RewriteRule . /index.html [L]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
确保 Apache 启用了 `mod_rewrite` 模块。
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 其他服务器
|
|
|
|
|
|
|
|
|
|
|
|
#### Node.js (Express)
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
const express = require('express');
|
|
|
|
|
|
const path = require('path');
|
|
|
|
|
|
const app = express();
|
|
|
|
|
|
|
|
|
|
|
|
app.use(express.static(path.join(__dirname, 'dist')));
|
|
|
|
|
|
|
|
|
|
|
|
// Vue Router history 模式 fallback
|
|
|
|
|
|
app.get('*', (req, res) => {
|
|
|
|
|
|
res.sendFile(path.join(__dirname, 'dist/index.html'));
|
|
|
|
|
|
});
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### Node.js (Koa)
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
const Koa = require('koa');
|
|
|
|
|
|
const serve = require('koa-static');
|
|
|
|
|
|
const { historyApiFallback } = require('koa2-connect-history-api-fallback');
|
|
|
|
|
|
const app = new Koa();
|
|
|
|
|
|
|
|
|
|
|
|
app.use(historyApiFallback());
|
|
|
|
|
|
app.use(serve('dist'));
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### IIS (web.config)
|
|
|
|
|
|
创建 `web.config` 文件:
|
|
|
|
|
|
```xml
|
|
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
|
<configuration>
|
|
|
|
|
|
<system.webServer>
|
|
|
|
|
|
<rewrite>
|
|
|
|
|
|
<rules>
|
|
|
|
|
|
<rule name="Handle History Mode and hash fallback" stopProcessing="true">
|
|
|
|
|
|
<match url="(.*)" />
|
|
|
|
|
|
<conditions logicalGrouping="MatchAll">
|
|
|
|
|
|
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
|
|
|
|
|
|
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
|
|
|
|
|
|
</conditions>
|
|
|
|
|
|
<action type="Rewrite" url="/index.html" />
|
|
|
|
|
|
</rule>
|
|
|
|
|
|
</rules>
|
|
|
|
|
|
</rewrite>
|
|
|
|
|
|
</system.webServer>
|
|
|
|
|
|
</configuration>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 4. Spring Boot(如果前端文件集成在后端)
|
|
|
|
|
|
|
|
|
|
|
|
如果前端文件已经复制到 `src/main/resources/static/` 目录,后端已经配置了 `FrontendController` 和 `ResourcesConfig`,应该可以正常工作。
|
|
|
|
|
|
|
|
|
|
|
|
## 部署步骤
|
|
|
|
|
|
|
|
|
|
|
|
1. **构建前端项目**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd xiyan-ui
|
|
|
|
|
|
npm run build:prod
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
2. **根据你的服务器类型**:
|
|
|
|
|
|
- **Nginx**:将 `dist` 目录内容复制到服务器,并配置 `nginx.conf`
|
|
|
|
|
|
- **Apache**:将 `dist` 目录内容和 `.htaccess` 文件复制到服务器
|
|
|
|
|
|
- **其他服务器**:使用相应的配置
|
|
|
|
|
|
|
|
|
|
|
|
3. **重启服务器**使配置生效
|
|
|
|
|
|
|
|
|
|
|
|
## 验证
|
|
|
|
|
|
|
|
|
|
|
|
配置完成后,测试以下场景:
|
|
|
|
|
|
1. ✅ 直接访问 `http://xiyan.cxmom.com/` - 应该正常显示首页
|
|
|
|
|
|
2. ✅ 访问 `http://xiyan.cxmom.com/board/kanban` - 应该正常显示看板页面
|
|
|
|
|
|
3. ✅ 在 `http://xiyan.cxmom.com/board/kanban` 页面刷新浏览器 - **不应该**再出现 404
|
|
|
|
|
|
|
|
|
|
|
|
## 注意事项
|
|
|
|
|
|
|
|
|
|
|
|
1. 确保静态资源路径正确(`/static/**`)
|
|
|
|
|
|
2. 确保 API 代理配置正确(如果前端独立部署)
|
|
|
|
|
|
3. 配置后记得重启 Web 服务器
|
|
|
|
|
|
|