前端请求接口地址反向代理后 状态码404、反向代理注意事项

目录

  • 1. 反向代理代码(有问题)
    • 问题
  • 2. 问题排查原因
    • 【排查步骤】
    • 【问题1】产生原因
    • 【问题2】产生原因
    • 【附:排查代码】
  • 3. 总结 - 解决代码
  • 4. 总结 - 反向代理

1. 反向代理代码(有问题)

接口封装

export function GetCardNum() {return request({url: '/mon_archive_cabinet_RFID/api/GetCardNum'})
}

代理配置

// webpack-dev-server 相关配置
devServer: {host: '0.0.0.0',port: 8080,https: false,hotOnly: false,open: true, // 自动打开浏览器proxy: {// ...'/api': {ws: false, // proxy websocketstarget: 'http://192.168.0.42:9151',pathRewrite: { '^/api': '' },},// ...'/mon_archive_cabinet': {target: 'http://192.168.0.26:9577',},'/mon_archive_cabinet_RFID': { // 【主要代码】代理代码target: 'http://localhost:5001',pathRewrite: { '^/mon_archive_cabinet_RFID': '' }},'/': {target: 'http://192.168.0.42:9000'}}
},

问题

接口404

在这里插入图片描述

2. 问题排查原因

【排查步骤】

【排查步骤】

  1. 思考一下:我们要先看一下接口请求地址 反向代理的真实地址 是哪里,然后看看是代理的问题还是其他问题;
  2. 真实地址查看:在代理配置中添加 logLevel: 'debug' 配置,就可以在终端打印出请求地址的代理地址,但是我的加上没有用,终端没有输出任何东西;
  3. 2没有用那就找其他办法查看代理的真实地址:代理配置在 onProxyRes 中给请求头添加 x-real-url1 配置展示真实的请求地址;
    在这里插入图片描述
  4. 发现代理的地址是 /api 的代理地址 http://192.168.0.42:9151 【问题1】
  5. 【问题1解决】修改 /api 代理为 ^/api (修改原因见下 问题1 解释)
  6. 发现代理的地址又变成了 /mon_archive_cabinet 代理的地址【问题2】
    在这里插入图片描述
  7. 【问题2解决】修改接口请求地址的前缀 /mon_archive_cabinet_RFID/RFID (即修改接口请求地址 /mon_archive_cabinet_RFID/api/GetCardNum/RFID/api/GetCardNum),并且修改反向代理 /mon_archive_cabinet_RFID/RFID (修改原因见下 问题2 解释)
  8. 验证【问题2解决】
    在这里插入图片描述

【问题1】产生原因

/api 代理的意思是:只要请求地址中含有 /api 就都使用该代理,并且不会使用该代理以下的其他代理;
^/api 代理的意思是:只匹配以 /api 开头的请求地址,其余的不匹配
【所以】修改 /api 代理为 ^/api

【问题2】产生原因

顺序问题、地址开头问题

/mon_archive_cabinet 代理:我们要使用的请求地址 /mon_archive_cabinet_RFID/api/GetCardNum含有该代理 && 请求地址开头与该代理一致(模糊匹配) && 该代理在 /mon_archive_cabinet_RFID 代理代码前,所以就匹配到了该代理而不继续匹配该代理代码后的 /mon_archive_cabinet_RFID 代理
【解决】2种办法

  1. /mon_archive_cabinet_RFID 代理的代码放在 /mon_archive_cabinet 代理代码前;
  2. 修改 /mon_archive_cabinet_RFID 代理名和请求地址开头地址(我用的这种解决办法)。

【附:排查代码】

代理配置 - 排查问题原因

devServer: {host: '0.0.0.0',port: 8080,https: false,hotOnly: false,open: true, // 自动打开浏览器proxy: {// ...// '/api': {'^/api': {ws: false, // proxy websocketstarget: 'http://192.168.0.42:9151',pathRewrite: { '^/api': '' },changeOrigin: true,logLevel: 'debug', // 该代码可在控制台输出代理的真实地址 - 但是我的就没有onProxyRes(proxyRes, req, res) {console.log('req.url----api----', req.url) // 会在终端打印出当前请求地址 - 不加域名的请求地址// 增加代理的真实地址const realUrl = new URL(req.url || '', 'http://192.168.0.42:9151' || '')proxyRes.headers['x-real-url1'] = realUrl // 在请求头添加 x-real-url1 字段,展示实际请求的地址 - 代理之后地址}},// ...'/mon_archive_cabinet': {target: 'http://192.168.0.26:9577',changeOrigin: true,logLevel: 'debug', // 该代码可在控制台输出代理的真实地址 - 但是我的就没有onProxyRes(proxyRes, req, res) {console.log('req.url----mon_archive_cabinet----', req.url) // 会在终端打印出当前请求地址 - 不加域名的请求地址// 增加代理的真实地址const realUrl = new URL(req.url || '', 'http://192.168.0.26:9577' || '')proxyRes.headers['x-real-url1'] = realUrl // 在请求头添加 x-real-url1 字段,展示实际请求的地址 - 代理之后地址}},// '/mon_archive_cabinet_RFID': { // 会和 /mon_archive_cabinet 代理冲突'^/RFID': {target: 'http://localhost:5001',changeOrigin: true,logLevel: 'debug', // 该代码可在控制台输出代理的真实地址 - 但是我的就没有onProxyRes(proxyRes, req, res) {console.log('req.url---RFID-----', req.url) // 会在终端打印出当前请求地址 - 不加域名的请求地址// 增加代理的真实地址const realUrl = new URL(req.url || '', 'http://localhost:5001' || '')proxyRes.headers['x-real-url1'] = realUrl // 在请求头添加 x-real-url1 字段,展示实际请求的地址 - 代理之后地址},// pathRewrite: { '^/mon_archive_cabinet_RFID': '' }pathRewrite: { '^/RFID': '' } // 实际请求中请求地址不会加 /RFID},'/': {target: 'http://192.168.0.42:9000'}}
},

3. 总结 - 解决代码

接口封装

export function GetCardNum() {return request({// url: 'http://192.168.10.106:5001/api/GetCardNum' // 本地ip// url: 'http://localhost:5001/api/GetCardNum' // 测试接口时接口地址// url: '/mon_archive_cabinet_RFID/api/GetCardNum' // 接口地址添加反向代理地址头(不用 - 因为会和 /mon_archive_cabinet 代理冲突)url: '/RFID/api/GetCardNum' // 接口地址添加反向代理地址头// url: '/mon_archive_cabinet/api/GetCardNum' // 排查问题时借用 /mon_archive_cabinet 地址头})
}

代理配置

devServer: {host: '0.0.0.0',port: 8080,https: false,hotOnly: false,open: true, // 自动打开浏览器proxy: {// ...'^/api': { // 【解决问题主要代码】添加 ^ 表示以 /api 开头的地址代理到此处;不加 ^ 则只要地址里有 /api 就可代理此处,代理此处后则此处以下的代码将不会被代理到ws: false, // proxy websocketstarget: 'http://192.168.0.42:9151',pathRewrite: { '^/api': '' },},// ...'/mon_archive_cabinet': {target: 'http://192.168.0.26:9577',},// '/mon_archive_cabinet_RFID': { // 会和 /mon_archive_cabinet 代理冲突,所以不用'^/RFID': {target: 'http://localhost:5001',// changeOrigin: true, // 默认是 true// pathRewrite: { '^/mon_archive_cabinet_RFID': '' }pathRewrite: { '^/RFID': '' }},'/': {target: 'http://192.168.0.42:9000'}}
},

4. 总结 - 反向代理

  • 代理地址有多个时:
    1. 注意是以某些地址开头还是含有某些地址;
    2. 注意模糊匹配,不是匹配地址中 / 和 / 之间的精准匹配;
    3. 注意代理地址顺序,以免写在最后的代理被写在前边的代理优先代理,导致请求失败。

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

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

相关文章

回归与聚类算法系列④:岭回归

目录 1. 背景 2. 数学模型 3. 特点 4. 应用领域 5. 岭回归与其他正则化方法的比较 6、API 7、代码 8、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数…

机器学习(12)---梯度下降(含手写公式、推导过程和手写例题)

梯度下降 一、概述1.1 梯度下降的用途1.2 梯度下降公式 二、公式讲解2.1 推导过程2.2 例题 一、概述 1.1 梯度下降的用途 1. 使用线性回归的平方误差成本函数时,成本函数不会也永远不会有多个局部最小值。因为它是凸函数,只有单一的全局最小值。通俗地说…

Linux之yum/git的使用

目录 一、yum 1、关于yum 2、yum的操作 ①、yum list ②、yum install ③、yum remove 二、git 1、Linux中连接gitee 2、git的操作 ①git add [文件] ②git commit -m "提交日志" ③git push 3、可能出现的问题 ①配置用户名、邮箱 ②出现提交冲突 ③…

SpringBoot2.0入门(详细文档)

文章目录 Springboot是什么Springboot2.x依赖环境和版本新特性说明为什么学习Springboot从springboot优点来看从未来发展的趋势来看 开发环境Spring Boot开发环境搭建和项目启动jdk 的配置Spring Boot 工程的构建maven配置IDEA 快速构建maven 创建工程常用注解 完整代码 Spring…

成集云 | 聚水潭对接金蝶云星空接口 | 解决方案

源系统成集云目标系统 方案介绍 聚水潭是一款以SaaS ERP为核心,集多种商家服务为一体的SaaS协同平台,为全国35万多家电商企业提供全面的信息化解决方案。聚水潭已在全国设立了超过60个线下服务网点,服务范围覆盖超过300个城市,为…

23062C++QTday3

1> 自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量 成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 头文件stack.c #ifndef STACK_H #define STACK_H #in…

Elasticsearch实现词云效果Demo

文章目录 前言前期准备springbootElasticsearch依赖 思路准备数据查询数据处理文本样式处理 具体实施数据准备创建索引数据存储进行查询 踩坑记录聚合查询不生效问题 demo地址总结 前言 最近项目中使用Elasticsearch在做快速查询的功能,然后就想到了之前的一个项目…

9月1日作业

思维导图 服务器代码 #include<myhead.h>#define PORT 4567 #define IP "192.168.6.225"struct msg //接收到的客户端信息结构体 {char type;char name[20];char txt[128]; };//定义节点类型 typedef struct Node {union{struct sockaddr_in cin; //数据…

SpringMVC增删改查(CRUD)的实现

目录 前言 一、前期准备 1.pom.xml---依赖与插件的导入 2.jdbc.properties---数据库连接 3.log4j2.xml---日志文件 4.spring-mybatis---mybatis与spring整合文件 5.spring-context---spring上下文配置 6.spring-mvc 7.generatorConfig.xml---代码生成器 8.web.xml 二…

核心实验16_端口镜像_ENSP

项目场景&#xff1a; 核心实验16_端口镜像_ENSP 实搭拓扑图&#xff1a; 具体操作&#xff1a; 交换机: [garliccc]observe-port 1 interface GigabitEthernet 0/0/3 /设置0/0/3为观察口 [garliccc]int g0/0/2 [garliccc-GigabitEthernet0/0/2]port-mirroring to observe-po…

win 10 安装新程序总是弹出提示:目前无法访问smartscreen

win 10 安装新程序总是弹出提示&#xff1a;目前无法访问smartscreen 因为后来无法再现警告&#xff0c;无法截图 搜索安全&#xff0c;找到 Windows 安全中心 找到“应用和浏览器控制”&#xff0c;关闭其中 2 项 SmartScreen 奇怪的是&#xff0c;之后我又改回去了&#x…

npm install失败的分析与解决方案,以及修复完成的代码地址

问题描述&#xff1a; 在引入vue-element-admin后npm i 初始化失败&#xff0c;或者对下载的vue项目npm i 任何插件都会失败&#xff0c;且安装依赖时报错 npm ERR! Error while executing npm ERR! Error while executing: npm ERR! H:\Program Files\git\Git\cmd\git.EXE ls…

接口测试(详细总结)

序章 ​ 说起接口测试&#xff0c;网上有很多例子&#xff0c;看了不不知道他们说的什么&#xff0c;觉得接口测试&#xff0c;好高大上。认为学会了接口测试就能屌丝逆袭&#xff0c;走上人生巅峰&#xff0c;迎娶白富美。因此学了点开发知识后&#xff0c;发现接口测试其实都…

第P4周:猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;Pytorch实战 | 第P4周&#xff1a;猴痘病识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、前期准备 1.设置GPU 设置GPU device torch.device…

系统架构设计师-嵌入式系统

目录 一、嵌入式系统概述 1、基本概念 2、嵌入式系统软件组成架构 二、嵌入式软件开发 三、嵌入式硬件 1、嵌入式微处理器 2、人工智能芯片 3、嵌入式微处理器体系结构 4、总线 四、嵌入式操作系统 1、嵌入式实时操作系统 2、操作系统内核架构 3、鸿蒙操作系统 五、嵌入式…

postman token 请求头添加

思路&#xff1a; 1、登录成功后将 得到的token设置为集合变量 2、在需要携带Authorization的请求头上使用该集合变量 关键代码 const responseData pm.response.json(); if(responseData.code 1) {// 获取tokenconst {data:{token}} responseData// 设置为集合变量pm.colle…

编译OpenWrt内核驱动

编译OpenWrt内核驱动可以参考OpenWrt内部其它驱动的编写例程&#xff0c;来修改成自己需要的驱动 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码&#xff1a; git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update -…

vue中如何给特殊字段设置插槽

大纲: <template><div><div><span>卡号</span><el-input type"text" v-model"cardNo" clearable placeholder"请输入卡号" /><el-button type"primary" plain icon"el-icon-search"…

我们如何在工作与生活中找到平衡点?

找到工作与生活中的平衡点是每个人都必须面对的问题。以下是一些建议&#xff0c;可以帮助你在工作和生活之间找到平衡&#xff1a; 制定时间表&#xff1a;确保你有足够的时间来处理工作和生活中的各种任务。为工作、学习和个人生活设定优先级&#xff0c;并确保时间分配合理…

ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案

ElasticSearch第三讲&#xff1a;ES详解 - Elastic Stack生态和场景方案 本文是ElasticSearch第三讲&#xff0c;在了解ElaticSearch之后&#xff0c;我们还要了解Elastic背后的生态 即我们常说的ELK&#xff1b;与此同时&#xff0c;还会给你展示ElasticSearch的案例场景&…