nignx部署Vue单页面刷新路由404问题解决

在linux下搭建nginx测试网页的时候,正常打开可以访问,当刷新后页面出现404 not found的问题

说明:

vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。
如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

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

当你使用 history 模式时,URL 就像正常的 url,例如 http://yoursite.com/user/id,也好看!不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404,这就不好看了。

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

解决方法:

Apache

<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;
}

Node.js (Express)
https://github.com/bripkens/connect-history-api-fallback
警告
给个警告,因为这么做以后,你的服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。

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

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

IIS的处理方法

1.安装url重写模块,找到管理下的web平台安装程序,搜索url,选择url重写工具2.0,选择安装。

2.添加规则。点击url重写,选择添加规则,空白规则,输入名称,按照下图进行配置。

3.vue程序中添加两条路由。

下面总结下:

url重写设置中,将配置url选择为与模式匹配,模式中填入*,使用选项选择通配符;即表示所有的网站都通过此模式进行检查匹配。匹配的条件是下面的条件选项,我们选择的是不是文件,逻辑分组为全部匹配。

操作为重写到我们的index.html(根据情况,设置为自己的单页面应用首页)。以上操作是设置我们的页面请求为先检查有没有此文件,没有此文件全部重写到我们的首页中,从而能够是的我们的自定义路由起作用。

然后我们在vue程序中设置/index.html路径为我们的起始页面,并且定义404页面。至此完成设置。

原文地址:https://www.cnblogs.com/wuchenggong/p/9670933.html

时间: 2024-10-13 08:10:58

nignx部署Vue单页面刷新路由404问题解决的相关文章

IIS中部署vue程序,刷新直接404

问题描述:直接访问首页可以刷新,但是在其他页面时候是不能刷新的,原因是路由机制和iis的认知不一致,在centos中配置nginx就ok了,但是在iis中怎么整? 解决方案:一般可以直接解决的方法也就懒的记录了,但是这个真的太耽误人了(也可能之前这么写也是可以执行的,但现在不行了),原因是查到了很多链接指向了这个https://blog.csdn.net/yinjing8435/article/details/71274416,按照操作走了一遍不对啊,一直报500的错误,我就服气了,又查了半天查

解决vue单页面刷新后vuex中数据恢复初始值的问题

思路是页面关闭前将state的数据存储到浏览器缓存里,页面加载时再取出来存到state中 //App.vue created () { if (this.$getLocal("store")) { this.$store.replaceState( Object.assign({}, this.$store.state, this.$getLocal("store", "parse")) ); } window.addEventListener(

Vue 子路由 与 单页面多路由 的区别

跟着学完了基础课程,打算整理一波笔记,对基本概念梳理一遍,惊觉对子路由和单页面多路由混淆的一塌糊涂. 果然,基础课程的坑新手是体会不到的. 由于子路由仅嵌套了一层,多路由给了左右两个组件,而且两个都是在默认组件下进行的.于是,妥妥误会俩作用一样.我发现自己问题,并尝试网上找到区别时,发现并没有人写出来.只好去官网看了一下文档. 哇塞,真是一语惊醒梦中人啊!!! 上面就是官网对子路由的解释,人家说的很清楚了,嵌套路由!!!是一层层嵌套的!!! 再看看传说中的多路由是啥 嗯,也不叫多路由,而是叫命名

fullpage在vue单页面当中使用会出现的问题以及解决办法

在 vue 单页面当中发现fullpage会报错,报错信息大概意思为,fullpage不允许初始化多次. 解决办法,在使用fullpage的组件跳转路由进入销毁组件之前的生命周期的时候对fullpage也进行销毁,这样就可以重新初始化一个fullpage组件了. $.fn.fullpage.destroy('all'); 在beforeDestroy这个生命周期执行,就可以了

vue单页面程序

vue单页面程序 gitHub地址:https://github.com/lily1010/vue_singlePage 举个栗子: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue-router.js" type="text/javascript&qu

处理 Vue 单页面应用 SEO 的另一种思路

vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plugin形成更优的配合) 单页面应用在前端正大放光彩.三大框架 Angular.Vue.React,可谓妇孺皆知.随着单页面应用的普及,人们在感受其带来的完美的用户体验,极强的开发效率的同时,也似乎不可避免的要去处理 SEO 的需求. 本文主要针对 vue 2.0 单页面 Meta SEO 优化展开介

第4节:单页面多路由区域操作

这节课我们讲"单页面多路由区域操作",实际需求是这样的,在一个页面里我们有2个以上<router-view>区域,我们通过配置路由的js文件,来操作这些区域的内容.例如我们在src/App.vue里加上两个<router-view>标签.我们用vue-cli建立了新的项目,并打开了src目录下的App.vue文件,在<router-view>下面新写了两行<router-view>标签,并加入了些CSS样式. 1 2 3 <rout

处理 Vue 单页面 SEO 的另一种思路

vue-meta-info 官方地址: https://github.com/monkeyWang... (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plugin形成更优的配合) 单页面应用在前端正大放光彩.三大框架 Angular.Vue.React,可谓妇孺皆知.随着单页面应用的普及,人们在感受其带来的完美的用户体验,极强的开发效率的同时,也似乎不可避免的要去处理 SEO 的需求. 本文主要针对 vue 2.0 单页面 Meta SE

vue单页面应用刷新网页后vuex的state数据丢失的解决方案

1. 产生原因其实很简单,因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,store里面的数据就会被重新赋值. 2. 解决思路一种是state里的数据全部是通过请求来触发action或mutation来改变 一种是将state里的数据保存一份到本地存储(localStorage.sessionStorage.cookie)中 很显然,第一种方案基本不可行,除非项目很小或者vuex存储的数据很少.而第二种可以保证刷新页面数据不丢失且易于读取. 3. 解决过程首先