vite 在proxy代理中更改headers

news2024/11/18 20:02:21

vite 在proxy代理中更改headers

平时我们在对接接口时,我们都是配置代理解决跨域问题

 proxy: {
     '^/api': {
         target: envConfig.VITE_APP_BASE_URL,
         changeOrigin: true,
         rewrite: (path) => path.replace(/^/api/, ''),
   }
 } 

某天你明明配置好了代理,浏览器还是会有跨域问题报错

查看response header, 你会发现

 Access-Control-Allow-Origin: *, * 

这里Access-Control-Allow-Origin不单是一个*

google后可以确定是这个请求头被设置了2次*

和后端反馈后,很久啥也没查出来,就是解决不了

那前端要怎么做呢?

思路1

在项目中重启一个node服务,再做一次转发,在转发的过程中重写这个response header解决跨域问题

1.安装一个express
2.安装cors中间件
3.安装http-proxy-middleware进行代理转发

这里转发的时候不能说直接都转发了,你会发现还是有问题

 const { createProxyMiddleware, responseInterceptor } = require('http-proxy-middleware');
 ​
 const proxy = createProxyMiddleware({
   selfHandleResponse: true, 
   onProxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
       res.removeHeader("Access-Control-Allow-Origin")
       res.setHeader("Access-Control-Allow-Origin", "*")
       return responseBuffer
 }),
 }); 

这里一定要设置selfHandleResponse属性,相当于自定义返回结果

然后在监听onProxyRes回调函数的同时,使用responseInterceptor对返回进行拦截

responseInterceptor内部是一个异步函数,一定要使用async进行修改,不然你会发现修改的没有生效

但这样还是太烦了,你还要维护另一个服务,而且配置的自定义变量也不好使用了。。。

思路2

从vite本身的代理服务入手,你想vite这种级别的工具,这种口子应该留的呀

查询文档,没有细说,只能查到有个configure方法可以重写

打开vite源码找一找

源码中server下的middleware有个proxy, 就是代理中间件,就是我要找的

发现就是使用的一个社区库

http-party/node-http-proxy: A full-featured http proxy for node.js (github.com)

这个库最近更新3年前。。。

我们这里要覆盖response header

所以监听proxyRes方法,方法内进行操作res的headers

 server: {
   port: 3008,
   open: true,
   proxy: {
     '^/api': {
       target: envConfig.VITE_APP_BASE_URL,
       changeOrigin: true,
       rewrite: (path) => path.replace(/^/api/, ''),
       selfHandleResponse: true,
       configure: (proxy, _options) => {
         proxy.on('proxyRes', (proxyRes, req, res) => { 
           res.removeHeader("Access-Control-Allow-Origin")
           res.removeHeader("access-control-allow-origin")
           res.setHeader("Access-Control-Allow-Origin", "*")
           res.setHeader("content-type","application/json")

           proxyRes.pipe(res)
       });
     }
   },
 }
 }, 

这样就可以解决返回头中多次设置Access-Control-Allow-Origin的问题

同理你也可以更改request headers

你学废了吗?

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

嵌入式Linux-守护进程

1.守护进程 1.1 何为守护进程 守护进程(Daemon)也称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些事情的发生,主要表现为以下两个特点: 长期运行。 守…

Java中的多线程安全问题

目录 一、什么是线程安全? 二、线程不安全的原因 2.1 从底层剖析count的操作 2.2 线程不安全的原因总结 2.3 JVM内存模型(JMM) 三、synchronized 关键字-监视器锁monitor lock 3.1 如何加锁(Synchronized用法和特性&#xff…

【sklearn】模型融合_堆叠法

Stacking参数含义1. 工具库 & 数据2. 定义交叉验证函数2.1 对融合模型2.2 对单个评估器3. 定义个体学习器和元学习器3.1 个体学习器3.2 元学习器4. 评估调整模型5. 元学习器的特征矩阵5.1 特征矩阵两个问题 & Stacking5.2 StackingClassfier\Regressor参数cv - 解决样本…

C语言 动态通讯录实现(附源码)

欢迎来到 Claffic 的博客 💞💞💞 前言: 上期博客写了静态通讯录并且答应给大家写一个动态版,这不,它来了: 1.动态版与静态版的区别 静态版的内存空间开辟大小是固定的,放了预期的最…

Leetcode 剑指 Offer II 010. 和为 k 的子数组

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数组和一个整数 k ,请找到该数组中和为…

MTBF是什么意思?交换机做MTBF有什么要求?MTTF、MTBF和MTTR的区别是什么?

MTBF,即平均故障间隔时间,英文全称是“Mean Time Between Failure”。是衡量一个交换机的可靠性指标。单位为“小时”。它反映了交换机的时间质量,是体现交换机在规定时间内保持功能的一种能力。具体来说,是指相邻两次故障之间的平…

【考研】2020-Part A 作文(英一)

可搭配以下链接一起学习: 【考研】2018-Part B 作文(英一)_住在阳光的心里的博客-CSDN博客 目录 一、2020 Part A (一)题目及解析 (二)优秀范文 (三)参考译文 &a…

Ansible playbook 讲解与实战操作

文章目录一、概述二、playbook 核心元素三、playbook 语法(yaml)1)YAML 介绍1、YAML 格式如下2、playbooks yaml配置文件解释3、示例2)variables 变量1、facts:可以直接调用2、用户自定义变量3、通过roles传递变量4、 Host Invent…

LINUX---文件

目录第一部分:文件编程一.打开/创建文件二.文件的写入操作三.文件的读取四.文件的光标应用:计算文件的大小第二部分:文件操作原理:一.文件描述符静态文件和动态文件第三部分:文件编程小应用1.实现CP命令2.修改文件3.写…

安卓玩机搞机技巧综合资源-----修改rom 制作rom 解包rom的一些问题解析【二十一】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

【Vue笔记】Vue组件的创建、使用以及父子组件数据通信常见的几种方式

这篇文章,主要介绍Vue组件的创建、使用以及父子组件数据通信常见的几种方式。 目录 一、Vue组件的使用 1.1、局部组件 1.2、全局组件 1.3、动态组件(组件动态切换) 1.4、缓存组件 (1)如何缓存组件 (…

微服务技术--Nacos与Eureka

eureka注册中心 远程调用的问题 消费者该如何获取服务提供者具体信息? 服务提供者启动时向eureka注册自己的信息eureka保存这些信息消费者根据服务名称向eureka拉取提供者信息 如果有多个服务提供者,消费者该如何选择? 服务消费者利用负载均…

区块链技术1---密码学基础

摘要:BTC属于加密货币,其中必然涉及到密码学的知识,而比特币比较开放,交易记录,交易金额甚至是底层源代码都是对外开放,那么加密使用在何处?这里就来谈一谈1:哈希哈希函数是密码学的…

client-go实战之六:时隔两年,刷新版本继续实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一:准备工作client-go实战之二:RESTClientclient-go实战之三:Clientsetclient-go实战之四:…

JavaWeb开发(三)3.3——Spring Bean详解

一、Bean的概念 由 Spring IoC 容器负责创建、管理所有的Java对象&#xff0c;这些管理的对象称为 Bean&#xff0c;Bean 根据 Spring 配置文件中的信息创建。 二、基于XML方式管理bean对象 eg&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

【B-树、B+树、B* 树】多叉平衡搜索树,解决“IO次数”与“树高”问题~

目录 一、为什么会出现B-树&#xff1f; 面试题&#xff1a; 二、什么是B-树&#xff1f; 2.1、B,B-树,B*树 导航 三、B-树的模拟实现 3.1、插入结点分析 3.1.1、根节点的分裂 3.1.2、继续插入数据&#xff0c;分裂子节点 3.2.3、再次插入数据&#xff0c;导致根节点继…

tomcat和apache有什么区别?如何将内网发布到互联网访问?

tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的&#xff0c;我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联…

Android原生检测Selinux的三种方法

本文介绍 3 种检测 Android 设备 SELinux 状态的方法, Java 层检测Selinux已经没有太多意义,因为不是很靠谱,随便一个hook代码就能绕过,所以我要告诉你如何在 C 层完成检测。这几种方法在效率和抵抗mock SELinux State 的技术方面都不相同,因此在使用之前你需要知道每种方…

Windows server——部署DNS服务

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.DNS概述 1.DNS的诞生 二.DNS的功能 使用域名访问具有以下优点…

【大厂高频真题100题】《二叉树的序列化与反序列化》 真题练习第23题 持续更新~

二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限…