不同的路由模式

vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。

http://localhost:8080/#/Hello

如果不想要很丑的 hash,可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。当使用 history 模式时,URL 就像正常的 url。

const router = new VueRouter({
  mode: 'history',
  routes: [...]
})

// http://localhost:8080/Hello

不过这种模式需要后台配置支持。

如果后台没有正确的配置,当用户在浏览器直接访问匹配不到的资源就会返回 404。


服务器配置

如果要使用history模式,则需要进行服务器配置。所以,要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是 app 依赖的页面。如:


[ Apache ] 以wamp为例,需要对httpd.conf配置文件进行修改:

首先,去掉rewrite_module前面的#号注释

LoadModule rewrite_module modules/mod_rewrite.so

然后,将文档所有的AllowOverride设置为all

AllowOverride all

最后,需要保存一个.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>

[ Nginx ] 

location / {
  try_files $uri $uri/ /index.html;
}

这么做以后,服务器就不再返回404错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,应该在Vue应用里面覆盖所有的路由情况,然后再给出一个404页面

const router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '*', component: NotFoundComponent }
  ]
})

[ Nodejs ]

如果是用 Node.js 作后台,可以使用服务端的路由来匹配 URL,当没有匹配到路由的时候返回 404,从而实现 fallback。

const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
const NotFound = {template:'<div>not found</div>'}

const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar },
  { path: '*', component: NotFound},
]