前端请求接口地址反向代理后 状态码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应用开发、数…

【Ubuntu】创建桌面快捷方式并固定到docker栏

以pycharm软件为例: 1.首先需要找到软件的可执行文件及其所在的位置 这个位置我放在:/opt/pycharm-community-2023.2.1/bin/pycharm.sh 可执行文件为:pycharm.sh 2.转到:/usr/share/applications 这个路径专门存放应用快捷方式…

【开发日记】MySQL TIMESTAMP 类型建表异常

MySQL TIMESTAMP 类型建表异常 建表报错信息 incalid default value for xxx建表语句 CREATE TABLE 表名( ... 字段名 TIMESTAMP NULL DEFAULT 0000-00-00 00:00:00 , ... )报错原因 MySQL的sql_mode参数会影响对日期时间的处理方式。如果NO_ZERO_D…

机器学习(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、可能出现的问题 ①配置用户名、邮箱 ②出现提交冲突 ③…

antd setFieldsValue 设置初始值无效AutoComplete 设置默认值失败

antd form setFieldsValue 设置初始值无效 解决方案 setTimeout(()>{setFieldsValue(values)},100)antd AutoComplete 设置默认值失败 defaultValue 设置无效 解决方案 设置value,搭配onChange来设置修改

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在做快速查询的功能,然后就想到了之前的一个项目…

linux uboot制作自定义菜单指令menu

应用场景 由于有时候需要不同类型的屏幕显示,但是来回烧写又显得非常的麻烦,遇到上述问题的话,我们可以采取以下方法去解决刚刚的问题。 适用平台 尝试过在STM32MP157,RK356X,RK3588里使用 menu指令代码描述 新建一个指令文件&#xff1…

实现Internet的DNS服务架构

实现Internet的DNS服务架构 一.准备 1.安装最小化系统并进行必要配置 安装最小系统 配置网络 1.修改centos7,8网卡名为传统网卡名 sed -i.org /GRUB_CMDLINE_LINUX/s"$ net.ifnames0 " /etc/default/grub grub2-mkconfig -o /etc/grub2.cfg reboot 2.配置静态网址…

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…

latex 源码,\section如何居左显示

目录 问题描述&#xff1a; 问题解决&#xff1a; 不显示序号的办法&#xff1a; 居左对齐的方法&#xff1a; 问题描述&#xff1a; 一般无论是投稿期刊还是投稿会议&#xff0c;默认的.tex源码中的\section未必是居左显示的&#xff0c;有时候&#xff0c;需要在不更改.…

接口测试(详细总结)

序章 ​ 说起接口测试&#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…