在VUE项目中去掉URL中#的方法是什么
Admin 2022-08-08 群英技术资讯 1024 次浏览
这篇文章主要介绍“在VUE项目中去掉URL中#的方法是什么”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“在VUE项目中去掉URL中#的方法是什么”文章能帮助大家解决问题。最近,同事跟我说,项目的访问路径里的/#/挺不美观的,就下手尝试去掉,本以为就是一句代码搞定的事情,结果遇到不少问题。
现在把我遇到的情况记录下来,做个存档,如果看到文章的有缘人刚好遇到跟我一样的情况,我的内容能提供多一个解决方案也是不错的。
router的默认mode为hash模式,关于hash模式,官方文档这样描述:
它在内部传递的实际 URL 之前使用了一个哈希字符(#)。由于这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理。不过,它在 SEO 中确实有不好的影响。如果你担心这个问题,可以使用 HTML5 模式。
– -- 《Vue Router官方文档》
而关于history模式,官方文档是这样说的:
当使用这种历史模式时,URL 会看起来很 “正常”,例如 https://example.com/user/id。漂亮!
这正符合我们的需求。于是在我们的项目中启动路由mode的history模式:
let Router = new VueRouter({
mode: 'history',
routes: [...]
...
});
关于history模式,官方文档还提到:
不过,问题来了。由于我们的应用是一个单页的客户端应用,如果没有适当的服务器配置,用户在浏览器中直接访问 https://example.com/user/id,就会得到一个 404 错误。这就丑了。
不用担心:要解决这个问题,你需要做的就是在你的服务器上添加一个简单的回退路由。如果 URL 不匹配任何静态资源,它应提供与你的应用程序中的 index.html 相同的页面。漂亮依旧!
按步骤1修改完,部署到服务器之后,URL中的#确实没有了,但是当刷新页面,或者页面中有使用window.open打开的页面时,会出现404错误。
按官方文档的说明,需要配置服务器的回退路由,我们的环境是使用的nginx,使用以下配置解决了刷新404的问题
location / {
try_files $uri $uri/ @router;
index index.html index.htm app.html app.htm;
}
location @router {
rewrite ^.*$ /index.html break;
}
如果你的环境是apache或者其他服务器,可以参考官方文档进行配置
我的项目中有用使用相对路径获取静态资源,例如 <img src="./img/xxxx.png" /> 这种方式展示的图片,这时候这些图片都会抛出 Uncaught SyntaxError: Unexpected token < 404找不到资源的异常,这是由于启用history模式后相对路径造成的问题,将 vue.config.js 文件中 publicPath 或者 bashUrl 从./ 相对路径修改为 / 绝对路径即可
publicPath = '/';
我的项目环境中 http://localhost:8080/ 后没有需要添加固定的路径,如果你的有(比如 http://localhost:8080/domain/),需要按你的情况进行调整
项目部署之后,我发现有些接口请求出现了404的情况,检查发现 api 的axios 配置时的路径配置存在相对路径的使用,需要进行修改
调整之前的配置:
export const exampleApi = (id) => {
return request({
url: 'xxx/xxx/' + id,
method: 'get',
})
}
配置修改为:
export const exampleApi = (id) => {
return request({
url: '/xxx/xxx/' + id,
method: 'get',
})
}
这个问题困扰我不少时间,网上也没有找到网友有类似的情况,最后发现是因为开发环境调试时,为了解决跨域问题,在项目中配置了 webpack devServer 的 proxy,代理处理了所有的请求,通过使用 bypass 绕过html,就可以解决此问题
# vue.config.js文件
devServer: {
proxy: {
'/': {
target: url,
...
bypass: function (req, res, proxyOptions) {
if (req.headers.accept.indexOf('html') !== -1) {
console.log('Skipping proxy for browser request.');
return '/index.html';
}
},
},
}
}
前面三个问题解决后,本来以为已经全部正常。但是再测试发现,部分页面刷新仍然会出现问题,但是通过前端的排查未能发现原因。直到检查到nginx的配置时,发现这些出错误的页面的路由,与服务端的接口路由似乎是重合的!这些前端页面的路由被nginx匹配到服务端的路由,转发到服务端去处理,所以发生异常了!
解决问题的思路为,前端程序中给所有的接口添加统一的路由前缀入口,nginx转发时匹配这个统一的前缀即可。
axios.js:
# 设置bashURL axios.defaults.baseURL = "/api";
nginx配置文件:
location ^~ /api/ {
proxy_pass http://pig-gateway:9999/;
# proxy_set_header Host $http_host;
proxy_connect_timeout 60s;
proxy_send_timeout 45s;
proxy_read_timeout 450s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
开发环境跨域设置调整
vue.config.js:
devServer: {
...
proxy: {
...
'/api': {
target: url,
changeOrigin: true,
logLevel: 'debug'
},
},
...
}
至此,我的项目终于在生产环境以及开发环境都运行正常了
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家介绍了javascript进阶篇深拷贝实现的四种方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
input输入框禁止输入空格字符的正则表达式用于防止别人随意乱提交数据,禁止输入空格字符只需要使用js正则表达式即可,无需写任何js函数,如下。 inputtype=textname=userNameonkeyup=this.value=this.value.replace(/\s+/g,) 只需要在input中加入onkeyup=th
这篇文章主要介绍了vant picker+popup 自定义三级联动案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。本文介绍下Vue Router的安装与使用
这篇文章主要介绍了JavaScript 定时器,在JavaScript中定时器有两个 setInterval() 与 setTimeout() 分别还有取消定时器的方法,下面来看看文章的详细介绍
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008