Vue路由模式(history模式 刷新页面空白解决方案)

文章介绍了Vue的三种路由模式:Hash模式、HTML5History模式和Abstract模式,重点讲解了History模式在SEO和服务器配置上的考虑,提供了Nginx和IIS的URL重写配置示例,以解决History模式下的404问题。


前言

vue路由的三种模式 Hash模式History模式abstract 模式

一、Hash模式

  • Vue3:
  • Hash 模式是用 createWebHashHistory() 创建的:
import { createRouter, createWebHashHistory } from 'vue-router'
const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    //...
  ],
})
  • Vue2
import Router from 'vue-router'
const router = new Router({
	node: 'hash',
	routes: [
		//...
	]
})

它在内部传递的实际 URL 之前使用了一个哈希字符(#)。由于这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理。不过,它在 SEO 中确实有不好的影响。如果你担心这个问题,可以使用 HTML5 模式。

二、HTML5 (History)模式

  • Vue3
  • History模式是用 createWebHistory() 创建的:
import { createRouter, createWebHistory} from 'vue-router'
const router = createRouter({
  history: createWebHistory(),
  routes: [
    //...
  ],
})
  • Vue2
import Router from 'vue-router'
const router = new Router({
	node: 'history',
	routes: [
		//...
	]
})

当使用这种历史模式时,URL也会看起来很 “正常”,例如 https://example.com/user/id

history.go(-2);//后退两次
history.go(2);//前进两次
history.back(); //后退
hsitory.forward(); //前进

不过,问题来了。由于我们的应用是一个单页的客户端应用,如果没有适当的服务器配置,用户在浏览器中直接访问 https://example.com/user/id,就会得到下图 404 的错误。这就尴尬了。404 Not Found

Tips:本人参与的项目常见部署访问基本是Nginx,偶尔有使用Internet Information Services (IIS)

  • 解决方法如下:

1、nginx配置

修改nginx.conf文件如下:

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

or

location / {
     try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
     index index.html index.htm;
 }
 #对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
 #因此需要rewrite到index.html中,然后交给路由在处理请求资源
location @router {
    rewrite ^.*$ /index.html last; # /index.html 为项目根目录
}

2、Internet Information Services (IIS)配置

a、安装 IIS UrlRewrite

b、在网站的根目录下创建一个 web.config 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Handle History Mode and custom 404/500" stopProcessing="true">
          <match url="(.*)" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

三、Abstract 模式

abstract 是vue路由中的第三种模式,本身是用来在不支持浏览器API的环境中,暂未实际使用过,后期补充相关实现

  • Vue3
  • 在 SSR 上使用时,你需要手动传递相应的 history:
  • Abstract 模式是用 createMemoryHistory() 创建的:
// router.js
let history = isServer ? createMemoryHistory() : createWebHistory()
let router = createRouter({ routes, history })
// 在你的 server-entry.js 中的某个地方
router.push(req.url) // 请求 url
router.isReady().then(() => {
  // 处理请求
})

总结

以上就是Vue不同的历史模式内容,本文简单介绍了Vue History路由模式的使用,而具体的项目配置需根据项目实际情况配置。

感谢阅读!
参考:Vue路由的不同的历史模式

<think>首先,用户的问题是关于Vue路由History模式部署后页面空白的问题。用户提供了几个引用,我需要参考这些引用来构建答案。 关键点: - 用户说:"我想解决Vue路由History模式打包后页面空白的问题",并问"请问Vue路由History模式部署后页面空白 解决方案"。 - 引用包括关于Vue路由模式、部署问题、Nginx配置等的讨论。 从引用中提取相关信息: - [^1]: 提到在Nginx配置中,如果URL匹配不到静态资源,就跳转到index.html。 - [^2]: Vue3中使用`createWebHistory`,但部署后页面空白,可能需要修改配置。 - [^3]: 描述Vue路由的三种模式,包括History模式。 - [^4]: 建议将History模式改为Hash模式,并修改publicPath为'./'。 - [^5]: 针对非根目录部署,在Nginx配置中使用try_files。 用户的问题是关于History模式的,所以我应该专注于History模式解决方案,而不是建议切换到Hash模式,除非必要。 核心问题:在History模式下,部署后刷新页面出现空白,是因为服务器没有正确配置来处理前端路由。 解决方案: 1. **服务器配置**:确保服务器将所有请求重定向到index.html。对于Nginx,使用try_files指令。 - 来自[^1]:`try_files $uri $uri/ /index.html;` - 来自[^5]:对于非根目录,如部署在/aaa下,`try_files $uri $uri/ /aaa/index.html;` 2. **Vue配置**: - 在Vue路由中,使用`createWebHistory`(Vue3)或mode: 'history'(Vue2)。 - 在vue.config.js中,设置publicPath为'./'或根据部署路径调整。来自[^4]:`publicPath: process.env.NODE_ENV === 'production' ? './' : '/'` 3. **部署路径**:如果应用不是部署在根目录下,需要调整路由和publicPath。 步骤结构: - 回答应该清晰、结构化。 - 使用中文。 - 遵循系统级指令:行内数学表达式用$...$,独立公式用$$...$$(但这里可能不涉及数学公式,所以可以忽略)。 - 生成相关问题。 - 在引用段落末尾添加引用标识。 回答结构: 1. **解释问题**:简要说明为什么History模式刷新页面会出现空白。 2. **解决方案**: - 服务器配置(以Nginx为例)。 - Vue项目配置(路由和publicPath)。 - 其他注意事项。 3. **生成相关问题**:在末尾添加相关问题。 引用标识: - 在引用具体内容时添加[^1], [^2]等。 最终回答: - 帮助用户逐步解决问题。 - 确保真实可靠,基于提供的引用和常见知识。</think>### Vue路由History模式部署后页面空白解决方案Vue.js项目中,使用路由的History模式(如Vue3的`createWebHistory`或Vue2的`mode: 'history'`)可以消除URL中的`#`符号,提升用户体验。但部署后刷新页面出现空白,是因为服务器未正确配置:当用户直接访问或刷新非根路径(如`/about`)时,服务器会尝试加载对应文件(如`about.html`),但Vue是单页应用,所有路由应由前端处理,服务器只需返回`index.html`。以下是基于您的引用和常见实践的解决方案,以Nginx服务器为例(其他服务器类似)。 #### 步骤1: 配置服务器(以Nginx为例) 服务器需要将所有请求重定向到`index.html`,由Vue处理路由。这可以通过Nginx的`try_files`指令实现。 - **如果应用部署在根目录**(如`http://example.com`): ```nginx server { listen 80; server_name example.com; root /path/to/your/dist; # 替换为您的打包文件路径 index index.html; location / { try_files $uri $uri/ /index.html; # 所有请求都指向index.html } } ``` 引用[^1]中提到:如果URL匹配不到静态资源,就跳转到默认的`index.html`,这确保前端路由接管[^1]。 - **如果应用部署在子目录**(如`http://example.com/aaa`): 需要指定子路径,避免404错误。 ```nginx server { listen 80; server_name example.com; root /home/xxx/www; # 替换为您的根目录 location /aaa { # 子路径名称 try_files $uri $uri/ /aaa/index.html; # 指向子目录下的index.html } } ``` 引用[^5]针对非根目录部署,强调了`try_files`的使用,确保请求正确重定向[^5]。 #### 步骤2: 调整Vue项目配置 在服务器配置的基础上,确保Vue项目正确设置路由和打包路径。 - **Vue路由设置**:使用`createWebHistory`(Vue3)或`mode: 'history'`(Vue2),并指定基础路径(如果部署在子目录)。 - Vue3示例: ```javascript import { createRouter, createWebHistory } from 'vue-router'; const router = createRouter({ history: createWebHistory('/'), // 根目录部署,或改为'/aaa/'用于子目录 routes: [/*...*/], }); ``` 引用[^2]指出,Vue3中使用`createWebHistory`时,需确保基础路径匹配部署环境[^2]。 - Vue2示例: ```javascript import Router from 'vue-router'; const router = new Router({ mode: 'history', base: '/', // 根目录部署,或改为'/aaa/'用于子目录 routes: [/*...*/], }); ``` - **修改publicPath**:在`vue.config.js`中,设置publicPath为相对路径`./`,确保静态资源加载正确。 ```javascript module.exports = { publicPath: process.env.NODE_ENV === 'production' ? './' : '/', // 生产环境用'./' }; ``` 引用[^4]提到,将publicPath改为`./`可以解决资源加载问题,避免空白页面[^4]。 #### 步骤3: 其他注意事项 - **重新打包和部署**:修改配置后,运行`npm run build`重新生成dist文件夹,并上传到服务器。确保服务器重启以应用新配置。 - **测试**:部署后,访问不同路由(如`/home`)并刷新页面,应正常显示。如果仍有问题,检查浏览器控制台是否有404错误。 - **备选方案**:如果服务器配置困难,可考虑回退到Hash模式(使用`createWebHashHistory`),但History模式更优,因为它避免URL中的`#`符号[^3]。 #### 常见问题排查 - **404错误**:服务器未正确重定向,检查Nginx配置的`try_files`指令。 - **资源加载失败**:publicPath未设为`./`,导致CSS/JS文件路径错误。 - **非Nginx服务器**:Apache可使用`.htaccess`文件(添加`FallbackResource /index.html`),或参考服务器文档。 通过以上步骤,大多数History模式部署问题可解决。如果问题持续,提供更多部署细节(如服务器类型、Vue版本)以便进一步诊断。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值