vue项目如何去掉URL中#符号的方法

目录
  • 前言
  • 正常解决步骤
    • 1. 设置路由mode
    • 2. 配置服务端nginx
  • 可能碰到的问题
    • 1. 静态资源Uncaught SyntaxError: Unexpected token < 问题
    • 2. api接口请求404问题
    • 3. 开发环境(npm run dev启动)刷新404的问题
    • 4. 前端路由与服务端接口路由冲突问题
  • 结尾

前言

最近,同事跟我说,项目的访问路径里的/#/挺不美观的,就下手尝试去掉,本以为就是一句代码搞定的事情,结果遇到不少问题。

现在把我遇到的情况记录下来,做个存档,如果看到文章的有缘人刚好遇到跟我一样的情况,我的内容能提供多一个解决方案也是不错的。

正常解决步骤

1. 设置路由mode

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: [...]
  ...
  });

2. 配置服务端nginx

关于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或者其他服务器,可以参考官方文档进行配置

可能碰到的问题

1. 静态资源Uncaught SyntaxError: Unexpected token < 问题

我的项目中有用使用相对路径获取静态资源,例如 <img src="./img/xxxx.png" /> 这种方式展示的图片,这时候这些图片都会抛出 Uncaught SyntaxError: Unexpected token < 404找不到资源的异常,这是由于启用history模式后相对路径造成的问题,将 vue.config.js 文件中 publicPath 或者 bashUrl 从./ 相对路径修改为 / 绝对路径即可

publicPath = '/';

我的项目环境中 http://localhost:8080/ 后没有需要添加固定的路径,如果你的有(比如 http://localhost:8080/domain/),需要按你的情况进行调整

2. api接口请求404问题

项目部署之后,我发现有些接口请求出现了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',
  })
}

3. 开发环境(npm run dev启动)刷新404的问题

这个问题困扰我不少时间,网上也没有找到网友有类似的情况,最后发现是因为开发环境调试时,为了解决跨域问题,在项目中配置了 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';
          }
        },
      },
  }
}

4. 前端路由与服务端接口路由冲突问题

前面三个问题解决后,本来以为已经全部正常。但是再测试发现,部分页面刷新仍然会出现问题,但是通过前端的排查未能发现原因。直到检查到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'
      },
    },
     ...
 }

结尾

至此,我的项目终于在生产环境以及开发环境都运行正常了

到此这篇关于vue项目如何去掉URL中#符号的文章就介绍到这了,更多相关vue去掉URL中#内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue.js路由mode配置之去掉url上默认的#方法

    比如 : http://localhost:8080/#/login 路由中间默认带有 # 如果需要去掉#,只需将mode的默认值'hash'改为'history'即可. router.js : import Router from 'vue-router' import routers from './routers' export default () => { return new Router({ routers, mode: 'history' // 加上这个配置项,url默认的 #

  • 详解如何去除vue项目中的#——History模式

    使用vue-cli搭建的环境,在配置好路由之后,可以看到下面的情况: 但是不难发现#的出现真的很丑陋,并且也不知道这是什么作用? 所以就去Stack Overflow上搜索了,果然还有~  看来Stack Overflow是真的强大,你在项目中遇到的问题实际上在so上都已经被问过并且解决了,这不:   这是最高票的回答,即在vue2中将mode模式设置为history,试过之后确实奏效! 但是知道这样可以解决问题,却不知道为什么,这是不行的, 随着连接,我们看到了文档. 所以这篇文章也就是引申到

  • 浅谈vue项目,访问路径#号的问题

    刚入手vue,有好多的疑问,目前遇到的是vue项目启动之后,输入http://ip:port,我发现浏览器里面显示的地址栏竟然是http://ip:port/#/,这个"/#/"不知道是什么东西,于是百度查了一下. 原因:对于vue开发的单页面应用,我们在切换不同的页面的时候,可以发现html永远只有一个,这也正是称之为单页面的原因.而vue-router默认hash模式--------使用URL的hash来模拟一个完整的URL,于是当URL改变时,页面不会重新加载.因为对于正常的页面

  • 记一次vue去除#问题处理经过小结

    1.vue项目,在浏览器中看到的路由都是带有#的,如果想去掉#,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面.只需要在路由表中,加入一行代码即可:使用mode: 'history'属性,在路由代码中添加mode:'history'即可 2.build以后部署到服务器,会出现刷新页面报404错误,查看了一些资料和官方vue history模式的配置方法进行尝试,我原以为就这样配置一下就可以了,结果--

  • vue 项目地址去掉 #的方法

    vue-router 设置 history 模式 vue 项目往往会搭配 vue-router 官方路由管理器,它和 vue.js 的核心深度集成,让构建单页面应用变得易如反掌.vue-router 默认为 hash 模式,使用 URL 的 hash 来模拟一个完整的 URL,所以当 URL 改变时,页面不会重新加载,只是根据 hash 来更换显示对应的组件,这就是所谓的单页面应用. 但是使用默认的 hash 模式时,浏览器 URL 地址中会有一个 # ,这跟以往的网站地址不太一样,可能也会让大

  • Vue Router去掉url中默认的锚点#

    hash模式url vue-router默认hash模式--使用URL的hash来模拟一个完整的URL,于是当URL改变时,页面不会重新加载. 如果不想要这种默认的hash模式,可以用路由的history模式,这种模式充分的利用history.pushState API来完成URL跳转而无需重新加载页面. index.js Vue.use(Router) export default new Router({ mode: 'history', routes: [ { path:"/xxx&quo

  • Vue 去除路径中的#号

    在开发过程中发现路径中带有/#/的标示,而且还去不掉,很丑陋. 众所周知,vue-router有两种模式,hash模式和history模式. 带#的则是hash模式. 将router中的mode设置为history就可以了 接下来有个问题,界面一刷新,就变404了!!!! 网上搜了下,需要对后端环境进行一个配置. 这里只列举nginx的配置,其他的配置点击这里去官网看 先配置config/index.js 修改assetsPublicPath为根目录 module.exports = { bui

  • 如何去除vue项目中的#及其ie9兼容性

    一.如何去除vue项目中访问地址的# vue2中在路由配置中添加mode(vue-cli创建的项目在src/router/index.js) export default new Router({ mode: 'history', routes: [ { path: '/', name: 'menu', component: menu, children: [ { path: 'organization', component: organization, children: [ { path:

  • vue项目如何去掉URL中#符号的方法

    目录 前言 正常解决步骤 1. 设置路由mode 2. 配置服务端nginx 可能碰到的问题 1. 静态资源Uncaught SyntaxError: Unexpected token < 问题 2. api接口请求404问题 3. 开发环境(npm run dev启动)刷新404的问题 4. 前端路由与服务端接口路由冲突问题 结尾 前言 最近,同事跟我说,项目的访问路径里的/#/挺不美观的,就下手尝试去掉,本以为就是一句代码搞定的事情,结果遇到不少问题. 现在把我遇到的情况记录下来,做个存档,

  • laravel框架实现去掉URL中index.php的方法

    1.将框架根目录下的server.php文件重命名为index.php 2.将框架根目录下的文件夹public下的.htaccess文件复制到框架根目录下,与index.php处于同一目录 3.修改Apache的httpd.conf文件 1.httpd.conf文件所在路径\bin\apache\apache2.4.23\conf\httpd.conf,例如,我的电脑中httpd.conf路径为:D:\wamp\bin\apache\apache2.4.23\conf\httpd.conf 找到

  • 快速解决Vue项目在IE浏览器中显示空白的问题

    vue项目在IE浏览器中显示空白,是因为js文件没有加载,需要引入babel-polyfill这个东西,而用vue脚手架搭建的项目是没有引入此工具的 引入方法: 打开packge.json,在dependencies中加入:"babel-polyfill" : "^6.23.0" 然后重新npm install 在App.vue文件中import:import  "babel-polyfill" 这样IE浏览器就显示正常了. 以上这篇快速解决Vu

  • Vue项目打包部署到apache服务器的方法步骤

    vue项目在开发环境下,让项目运行起来,是通过npm run dev命令,原理是在本地搭建了一个express服务器. 但是在服务器上就不是这样的,必须要通npm run build命令来对整个项目进行打包,打包后会在项目目录下生成一个dist文件夹,内容如下: 然后就是把这些文件丢到服务器上的某个文件夹下,我这里的文件夹名字是ibms 遇到的问题: 1. 直接去访问http://www.xxx.com/ibms/,会发现网页是白屏的,什么都没有,这就比较奇怪了,其实是因为资源加载的路径有问题!

  • php使用正则表达式去掉html中的注释方法

    最近在项目中在需要输出浏览器中的源文件需要去掉html中的注释,在网上看了很多的方案,不过很多的答案都是一样的,并不能解决我的问题,于是就自己写正则表达式,也对正则有了更加深刻的理解. 首先比较基础的是: $a = '<!--ceshi-->ceshi'; $a = preg_replace('#<!--.*-->#' , '' , $a); var_dump($a); 上面的代码会输出ceshi. 但是如果是下面的字符串的话,就不能达到我们希望的效果了 $a = '<!--

  • JavaScript操作 url 中 search 部分方法函数

    前言 首先,我们需要知道什么是 search , search 是 window.location 的一个属性.举个例子: 首先,我们这里有一个 url,是 http://www.a.com/list/2.html?page=2&color=4&size=3#pic. 我们访问访问这个地址,打开控制台,输入window.location,会得到如下图的结果 如上,我们要操作的就是上图中方框框出来的这个部分. 为什么要操作这个? 例如,我在第二页,需要跳转到第三页,就需要把上面的 page=

  • 为vue项目自动设置请求状态的配置方法

    在进入一个页面的时候,一般在获取数据的同时,会先显示一个 loading ,等请求结束再隐藏 loading 渲染页面,只需要用一个属性去记录请求的状态,再根据这个状态去渲染页面就好了 async handler() { this.loading = true await fetch() this.loading = false } 虽然是很简单的功能,可是要处理的地方多的时候,还是很繁琐的,就想着能不能统一设置处理请求的 loading ,然后页面根据 loading 的状态决定要显示的内容,

随机推荐