Vue CLI 4项目直接粘贴路由URL无法访问问题求助
这个问题我碰到过好多次啦,本质是Vue Router的history模式和服务器默认请求处理逻辑的冲突,咱们一步步解决:
问题根源
当你设置mode: 'history'时,Vue Router会使用HTML5 History API来管理路由——从首页点击菜单跳转是前端路由,浏览器不会向服务器发起新请求;但直接粘贴http://my-site.com/events时,浏览器会直接向服务器请求这个路径,而服务器默认会去找/events对应的文件或目录,找不到就返回404。实际上我们需要服务器返回项目的index.html,让Vue Router来接管这个路由的渲染。
解决方案
1. 开发环境(Vue CLI 4的devServer)
Vue CLI已经内置了处理这个问题的配置,只需要在项目根目录的vue.config.js(如果没有就新建一个)里添加:
module.exports = { devServer: { historyApiFallback: true } }
保存后重启开发服务器,现在直接粘贴子路由URL就能正常访问了。
2. 生产环境(部署到服务器)
根据你使用的服务器类型,配置方式略有不同:
Nginx
修改Nginx的站点配置文件(通常在/etc/nginx/sites-available/或/etc/nginx/conf.d/目录下),在对应的server块中添加:
location / { try_files $uri $uri/ /index.html; }
这个指令的意思是:先尝试访问请求的文件或目录,如果找不到,就返回index.html。配置完成后重启Nginx:sudo systemctl restart nginx。
Apache
在项目的根目录(也就是dist文件夹里)创建.htaccess文件,写入以下内容:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule>
确保你的Apache服务器已经开启了mod_rewrite模块(大多数主流主机默认开启)。
Express(Node.js服务器)
先安装connect-history-api-fallback中间件:
npm install connect-history-api-fallback --save
然后在你的Express启动文件中添加:
const express = require('express'); const history = require('connect-history-api-fallback'); const app = express(); // 必须先使用history中间件,再托管静态文件 app.use(history()); app.use(express.static(__dirname + '/dist')); app.listen(3000, () => { console.log('Server running on port 3000'); });
额外注意事项
如果你的项目部署在子路径下(比如http://my-site.com/my-app/events),需要同时调整两个地方:
- 在
src/router/index.js中设置base: '/my-app/' - 服务器配置也要对应修改,比如Nginx的
location要改成/my-app/,try_files的最后一项改成/my-app/index.html
这样配置之后,不管是从首页跳转还是直接粘贴子路由URL,都能正常访问啦!
内容的提问来源于stack exchange,提问作者mstdmstd

