部署前端报错404 hash 以及history模式下面前端、后端如何配置

news2024/11/17 13:29:50

 问题描述:前端 本地页面 正常展示 、部署后刷新浏览器如上:

vue-router(前端路由)有两种模式,hash模式和history模式
原理的区别(原理)

1、hash ——即地址栏URL中的#符号。
hash 虽然出现URL中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变hash不会重新加载页面。
2、history ——利用了HTML5 History Interface 中新增的pushState() 和replaceState() 方法。需要特定浏览器支持;hash 能兼容到IE8, history 只能兼容到 IE10;
history模式,会出现404 的情况,需要后台配置。
3、hash模式下,仅hash符号之前的内容会被包含在请求中,如 http://www.baidu.com, 因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回404错误;
history模式下,前端的url必须和实际向后端发起请求的url 一致,如http://www.baidu.com/a/ 。如果后端缺少对/a 的路由处理,将返回404错误。

hash模式:

history模式:

history模式下配置nginx

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

history模式下配置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>

history模式下配置Node.js

const http = require('http')
const fs = require('fs')
const httpPort = 80

http.createServer((req, res) => {
fs.readFile('index.htm', 'utf-8', (err, content) => {
if (err) {
console.log('We cannot open "index.htm" file.')
}

res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
})

res.end(content)
})
}).listen(httpPort, () => {
console.log('Server listening on: http://localhost:%s', httpPort)
})

1.项目发布后通常有两种访问方式,

第一种: IP+端口直接访问的方式,如 http://192.168.1.107:8080/
第二种:IP+端口+项目名,如 http://192.168.1.107:8080/saas/

2.第一种方式:ip+端口(前端后端修改)

范例:vue-cli项目使用路由,tomcat作为服务器,项目文件夹名 saas

步骤:

1.修改配置文件 router.js

export default new Router({
      mode: 'history', // 将mode值改为history routes: [ { path: '/', name: 'HelloWorld', 
      component: HelloWorld } ] 
})

2.1将tomcat下的ROOT文件中的内容替换(选择其一)

(此种方式需要删除ROOT文件夹下的全部内容,将打包的文件放进去,无需修改配置文件)
找到tomcat目录,将tomcat->ROOT文件夹中文件全部删除,将打包好的dist文件夹中的文件全部放到ROOT文件夹中。

2.2修改tomcat->conf/server.xml配置(选择其一)

(此种方式无需删除ROOT文件夹中的内容,只需修改serve.xml中的配置)
找到tomcat目录,修改tomcat->conf/server.xml,增加Context节点。设置 docBase="/saas" 。其中的saas就是webapps目录下的项目名称(文件夹名)
**

3.第二种方式:ip+端口+项目名(前端修改)

范例:vue-cli项目使用路由,tomcat作为服务器,项目文件夹名 saas

步骤:

1.首先创建WEB-INF文件,文件夹中创建web.xml文件:

因为是history模式, 要防止在路由下刷新变成404错误,这需要让tomcat都定位到首页,也就是index.html页,以往我们使用Java写web项目部署在tomcat时,通常都会有一个WEB-INF文件夹,并包含一个web.xml文件,而vue项目build之后只是纯静态资源项目,所以我们需要在build之后的dist文件夹里新增一个WEB-INF文件夹,并新建web.xml文件。

在项目目录下新建WEB-INF文件夹, 接着在WEB-INF文件夹下新建 web.xml文件,内容如下:

< ? xml version = '1.0' encoding = 'UTF-8' ? >
 < web - app xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance"
     xmlns = "http://xmlns.jcp.org/xml/ns/javaee"
     xsi: schemaLocation = "http://xmlns.jcp.org/xml/ns/javaee/web-app_2_5.xsd"
     id = "scplatform" version = "2.5" >
            < display - name > /</display - name > 
            < error - page > 
            < error - code > 404 < /error-code> 
            <location>/index.html < /location>
            </error - page >
 < /web-app>

2.修改配置文件 router.js

export default new Router({ mode: 'history', // 开启history模式需要后端配置
404时返回/index.html base: '/saas/',
 //当项目不在根目录时,必须添加子目录路径,否则空白页面 routes: [ {path: "/home",
 // '/saas/home' name: "home", component: home }] })

3.修改 config文件夹下的 index.js中配置

build: { // Template for index.html index: path.resolve(__dirname, "../dist/index.html"), // Paths assetsRoot: path.resolve(__dirname, "../dist"),//构建输出目录,也就是构建后的东西都扔这里 assetsSubDirectory: "static",//源子目录 除了index.html,其余的js img css都分在这里 /**添加开始**/ //tomcat webapps/sass/ assetsPublicPath: "/saas/", //需要加上这一行项目目录,一个 / 表示根目录 /**添加结束**/ }

4.webpack设置不打包文件WEB-INF

到此处已经可以成功配置一个 tomcat 服务下的vue 的 history 模式的项目,但是不能每次打包去手动添加和更改新建WEB-INF文件夹吧,遇到过设置不打包文件 WEB-INF 文件时的配置未生效,导致WEB-INF 下的 web.xml文件被打包成js 文件,导致当前路由刷新报 404 错误。
(这个错误找了 好久,以为配置好了,就 Ok 了,由于代码同步问题,没注意可能就发生问题,所以上传服务器前一定要记得检查下WEB-INF文件夹是否存在 web.xml文件)

修改webpack.prod.conf.js配置

build: { // Template for index.html index: path.resolve(__dirname, "../dist/index.html"),
   // Paths assetsRoot: path.resolve(__dirname, "../dist"),
   //构建输出目录,也就是构建后的东西都扔这里 assetsSubDirectory: "static",
   //源子目录 除了index.html,其余的js img css都分在这里 /**添加开始**/ 
   //tomcat webapps/sass/ assetsPublicPath: "/saas/", 
   //需要加上这一行项目目录,一个 / 表示根目录 /**添加结束**/ 
  }

的的设置不打包问题可以自行搜索,关键词:webpack 设置不打包文件

5.到此处前端已经成功配置了tomcat 下 vue 的 history模式

项目最终目录如下图

6.注意vue-cli 3.x vue-cli打包配置还需要设置以下内容:

module.exports = {
  publicPath: "/saas",
  configureWebpack: {
    performance: {
      hints: false
    }
  }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sealos 安装报错问题解决

sealos 是以 kubernetes 为内核的云操作系统发行版,看其他人通过sealos安装k8s集群十分丝滑,但自己实践的时候为什么报错频繁呢? 官网介绍: sealos.io1 先决条件 每个集群节点应该有不同的主机名。 主机名不要带下划线。所有节点的时间同步。在 Kubernetes 集群的第一个节点…

数组中出现次数超过一半的数字、替换空格、重建二叉树

1、数组中出现次数超过一半的数字 本题考点&#xff1a; 数组使用&#xff0c;简单算法的设计 牛客链接 题目描述&#xff1a; 给一个长度为 n 的数组&#xff0c;数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 例如输入一个长度为9的数组[1,2,…

企业如何利用 Serverless 快速扩展业务系统?

2022 年 9 月 24 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 12 期活动在厦门举办。活动现场&#xff0c;阿里云高级技术专家史明伟&#xff08;花名&#xff1a;世如&#xff09;向参会企业代表分享了《未来已来——从技术升级到降本提效》。本文根据演讲内容整…

引擎入门 | Unity UI简介–第1部分(8)

本期我们继续为大家进行Unity UI简介&#xff08;第一部分&#xff09;的后续教程 本篇内容 17.9-Slice缩放 18.准备按钮图像 19.设置按钮图像 20.为按钮设置自定义字体 文章末尾可免费获取教程源代码 本篇Unity UI简介&#xff08;第一部分&#xff09;篇幅较长&#x…

Spring源码深度解析:八、bean的获取② - getSingleton

一、前言 文章目录&#xff1a;Spring源码分析&#xff1a;文章目录 在Spring源码分析七 &#xff1a;bean的加载① - doGetBean 文章中&#xff0c;我们介绍了Spring对获取bean的过程&#xff0c;但是并没有详细解释Bean是如何创建的&#xff0c;本文就来分析Spring是如何创…

Mybatis 源码分析

mybatis 的一些总结 XMLConfigBuilder mybatis 的配置文件解析的能力是交给了XMLCconfigBuilder 去解析的 public SqlSessionFactory build(Reader reader, String environment, Properties properties) {try {XMLConfigBuilder parser new XMLConfigBuilder(reader, envir…

JDK内置命令工具

JDK内置命令工具 jps 作用 查看java进程的pid和全路径主类名和jvm参数 使用 -l : 输出所有正在运行java进程的pid 和主类名-v &#xff1a;输出正在运行java进程的pid和主类名和运行参数 jstack 作用 查看某个java进程当前的堆栈信息&#xff0c; 也就是当前进程中的线程…

NIO与BIO服务器端对比

本文利用NIO实现一个重复回复&#xff0c;客户端发送什么信息&#xff0c;客户端就会收到什么信息。 主要是理解NIO与BIO的区别。客户端采用telnet进行测试&#xff0c;以下连接是Telnet安装的方法。 Telnet的简单使用_武汉小喽啰的博客-CSDN博客_telnet 注意&#xff01;&a…

POSIX信号量

文章目录概念信号量函数基于环形队列的生产消费模型概念 信号量是一个计数器&#xff0c;用来描述临界资源数量的计数器。 每个执行流要进入临界资源时&#xff0c;要先申请信号量&#xff0c;出临界资源时&#xff0c;要释放信号量。 信号量的PV操作 P操作&#xff1a;申请…

万字长文总结分布式事务,总有一款适合你

导语&#xff1a;本文参考网络相关文章&#xff0c;主要总结了XA, 2PC, 3PC, 本地事务状态表, 可靠消息队列, 最大努力通知, TCC, SAGA等分布式事务的特点和适用场景&#xff0c;为大家选择分布式事务提供一些参考。 概述 分布式事务是指事务的参与者、支持事务的服务器、资源…

宝刀未老!阿里P8老兵耗时三年总结出这份Java项目实战文档

文档特点&#xff1a; 为了方便小伙伴们能更好地阅读&#xff0c;我已经提前给大家整理好了学习路线和知识结构 本书综合讲解Java程序设计中的核心技术&#xff0c;全书一共设计为22章&#xff0c;章节结构如下。 需要获取的小伙伴可以直接转发关注后私信&#xff08;学习&…

[Python]Django 配置

文章目录&#x1f349; pycharm中打开Django项目并配置虚拟环境运行项目&#x1f348; 打开项目后pycharm自动识别配置项目运行环境&#x1f34d; 指定项目运行的端口号&#x1f348; 自行配置项目的运行环境&#x1f34d; 配置项目的python解释器&#x1f34d; 配置Django项目…

本地demo服务器搭建计划——(三)rabbitmq配置中心config配置自动刷新

本章内容主要使用Spring Cloud Config来启动一个配置中心服务&#xff0c;通过Spring Cloud Bus消息总线&#xff08;依赖rabbitmq&#xff09;和Git仓库&#xff08;Gitee&#xff09;Webhook钩子函数来实现配置的自动更新&#xff08;push新的配置到gitee仓库时触发&#xff…

【英语口语】单词如何正确发音?

1. 发音基础介绍 音素&#xff1a;元音 辅音 单词&#xff1a;重音 失去爆破 浊化 三单 过去式过去分词 句子&#xff1a;语调 重音 弱读 连读 缩读 段落&#xff1a;意群 元音字母&#xff1a; A、E、I、O、U 2. 音节的定义 英语单词在发音的时候&#xff0c;不是一个字…

GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来

GD32&#xff1a;上电不工作&#xff0c;需要按一下复位按键程序才能跑起来 文章目录GD32&#xff1a;上电不工作&#xff0c;需要按一下复位按键程序才能跑起来1.问题描述2. 我的调试思路2.1 第一步&#xff0c;排除电源问题2.2 第二步&#xff0c;排除复位电路的问题2.3 第三…

QUIC简介

一、概述、 QUIC&#xff08;Quick udp Internet connection&#xff09;&#xff1a;快速UDP互联网协议。相比于当前广泛应用的http2tcptls有如下优势&#xff1a; 减少三次握手及TLS握手时间&#xff1b;改进拥塞机制&#xff1b;避免队头阻塞的多路复用&#xff1b;连接迁移…

一文了解riscv软件系列之linux内核编译运行

一、交叉编译工具链的安装 【推荐阅读文章】 代码大佬的【Linux内核开发笔记】分享&#xff0c;前人栽树后人乘凉&#xff01; 一篇长文叙述Linux内核虚拟地址空间的基本概括 一文了解Linux内核的Oops 需要多久才能看完linux内核源码&#xff1f; 详细讲解磁盘及文件系统…

【antd vue pro】设置项目默认语言为中文:

文章目录一、官网文档&#xff1a;二、解决&#xff1a;1、在src\locales\index.js文件修改默认语言2、src\core\bootstrap.js文件&#xff0c;修改初始化的语言3、src\store\modules\app.js4、清空本地存储&#xff0c;然后npm run serve重启&#xff1a;5、遇到问题&#xff…

Linux文件权限管理:chomd命令和chown命令

Linux文件权限管理&#xff1a;chomd命令和chown命令前言介绍文件类型文件权限文件所属文件信息chomd命令chown命令前言 在服务器部署项目、安装应用会经常涉及到文件权限的问题&#xff0c;在此记录chomd命令和chown命令它们的用法及区别。 介绍 以下图为例&#xff0c;进行…

如何解决全局工业相机飞拍拖影问题

1.问题描述: 物体静态拍摄时图像正常&#xff0c;但是动态拍摄时会有拖影现象。 2.问题原因&#xff1a; 只要物体存在运动&#xff0c;拍摄就一定会存在拖影&#xff0c;那么如何判断飞拍项目能否使用&#xff1f;拖影是否会对飞拍造成影响呢&#xff1f;这就要看具体的检测…