咨询http-proxy-middleware的onProxyRes参数来源及CORS头注入问题
onProxyRes 回调参数定义
三个参数均为Node.js原生HTTP模块的核心实例,无特殊封装,来源清晰可追:
proxyRes:代理服务对接后端web服务时,从后端侧获取的上游响应实例,为IncomingMessage类型,承载后端返回的状态码、原始响应头、响应体流等信息req:前端web应用直接发送给代理服务的请求实例,为IncomingMessage类型,和你当前的认知完全一致res:代理服务准备回传给前端web应用的响应句柄,为ServerResponse类型,是服务端向客户端返回内容、设置响应头的原生操作对象,并非上游后端发来的响应内容
响应头注入的正确操作逻辑
这是新手高频踩坑点,没有复杂的抽象逻辑:
- 不要直接修改
proxyRes对象的headers属性来自定义注入响应头:onProxyRes事件触发时,http-proxy内部已经完成了对上游响应头的解析、并做好了向最终客户端响应映射的准备,此时直接修改proxyRes上的头属性,很容易因为内部逻辑已经读取完头信息、流已被部分消费而出现修改不生效的问题 - 正确的注入方式:直接操作面向客户端的
res对象设置响应头,比如通过res.setHeader('Access-Control-Allow-Origin', '*')添加跨域头,这类修改是直接作用于最终返回给前端的报文的,不存在时机偏差的问题
CORS报错的处理逻辑校验
你判断“注入跨域允许源头即可解决问题”的思路存在疏漏,完整的跨域处理需要覆盖几个必选项:
- 浏览器发起的CORS预检请求(请求方法为OPTIONS)不需要透传给后端web服务,代理层需要直接对这类请求返回204状态码,否则后端若未兼容OPTIONS请求处理,就会触发跨域拦截
- 仅添加
Access-Control-Allow-Origin: *不足以通过浏览器校验:还需要根据前端请求携带的方法、自定义请求头,补全Access-Control-Allow-Methods、Access-Control-Allow-Headers配置,否则浏览器会因为预检规则不匹配拦截请求 - 如果前端请求携带了cookie、HTTP认证信息等凭证内容,
*形式的通配源值不被浏览器认可,需要明确匹配具体的前端源地址,不能使用通配符 - 注意避免跨域头重复设置:如果后端web服务已经返回了跨域响应头,代理层再重复添加会导致同一响应头出现多个值,同样会被浏览器判定为非法跨域响应
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

