目的
因为浏览器具有跨域限制,某些api虽然开放,但是不能通过浏览器直接发起。
另外,如果前端直接发起请求,那么token就会暴露,有安全风险。
比如图床之类的需要apikey,前端直接发就会暴露key,然后人家就可以用你的key。
踩坑
使用代码写一套获取headers获取body然后直接转发,果不其然出事。
一般不转发请求头,但是搞响应头的时候出事了。
content-length(请求、响应)
浏览器请求头会带content-length,而请求工具和浏览器的处理有所不同,如此直接转发,会导致目标服务器处理失败。另外,响应通常通过网关压缩(比如nginx),所以直接转发这玩意也是不明智的。
无论是后端发起请求,还是返回给前端,都不应该手动设定content-length,而用代码直接转发时忽略了这一点
content-encoding(请求)
浏览器中的请求,设定的Accept-Encoding: gzip, deflate, br, zstd,然而,多数请求工具,比如python的httpx,不直接支持br和zstd。
由于不同的请求工具实现不同,因此直接不显式声明这个请求头是比较好的方案。
host(请求头)
请求的主机
其他
- Date(响应),日期
- Server(响应)
应该怎样
代码做不到一比一转发,那应该使用反向代理工具,然而反向代理工具不够灵活。
不同接口留下不同请求头,请求头能短就短。
响应头全扔掉,cookie之类的应该用代码处理,毕竟不是一个服务器让浏览器存下cookie没什么意义。