由Vite2升级到Vite3遇到的 http proxy error

4,943 阅读1分钟

在开发基于 Vue + Vite + tsx 项目时,将 Vite 版本由2升级到3,启动开发服务器后报错,经过排查发现是 proxy 的配置问题,将解决过程记录下来

错误信息

[vite] http proxy error at /api/v1/items/

Error: socket hang up

解决

vite.config.ts 中 proxy 配置新增changeOrigin

server:{
    proxy:{
      '/api/v1':{
        target:'接口服务器地址:3000/',
        changeOrigin: true,
      }
    }
  }

问题分析

根据 node-http-proxy中描述

changeOrigin: true/false, Default: false - changes the origin of the host header to the target URL

需要注意,changeOrigin字段修改的是 host 而非 origin

Host:请求将要发送到的主机名和端口号

Origin: 类似referer,表明请求来源,除GET和HEAD之外添加该请求标头

该字段设置为true主要解决虚拟主机的问题,与跨域无关。

如果设置为false,服务端接收到的请求头信息是

origin: 'http://localhost:5173'

host: 'localhost:5173'

如果设置为true,服务端接收到的请求头信息是

origin: 'http://localhost:5173'

host: 'localhost:3000'

Vite2 开启本地服务器地址为 localhost:3000,与 target 设置的接口服务器的地址一致(端口号都是3000),所以不会报错;而升级到 Vite3 后,默认端口号变化,导致请求失败返回错误状态码500。

那么,为什么浏览器端观察不到修改?

请求发送的时候 host 就是localhost:5173,发出去之后,被本地的代理服务拦截到了,在这个地方将 host 修改了,再发往后端服务器。也就是,host 修改时,浏览器已经将请求发出去了,所以观察不到。