我们后端接口加了IP白名单,只允许服务器IP访问。但我本地开发时用axios发请求,总被拒绝,提示“IP not allowed”。这不就没办法联调了吗?
我试过在请求头加X-Forwarded-For,但好像没用。是不是前端根本没法绕过这个限制?那正常开发流程该怎么处理?
<script>
axios.get('https://api.example.com/data', {
headers: {
'X-Forwarded-For': '123.123.123.123' // 后端白名单里的IP
}
})
</script>
我一般直接让后端在开发环境把白名单关掉,或者加个环境变量配置允许所有IP,本地联调搞什么白名单纯属给自己找事。正经做法是测试/生产环境才开白名单,开发环境放宽。
实在不行就用vite或webpack配个proxy代理,让本地服务器转发请求,这样后端看到的是localhost发起的请求,不过这招前提是你本地能连上后端服务。
X-Forwarded-For 这个头是给代理服务器用的,后端取客户端IP是拿的TCP连接层的真实IP,不是你HTTP头里随便写的那个。要是这能绕过,那白名单还有啥意义,随便伪造一下不就完了。
正经的解决方案有这么几个,按推荐程度排一下:
第一,开发环境和生产环境分开。后端应该区分环境,开发环境直接关掉IP白名单校验,或者改成只校验token之类的。这是最合理的做法,跟后端同事说一声,让他们加个环境变量控制。
第二,把你的开发机IP加到白名单里。如果你公司网络有固定出口IP,让运维加进去就行。如果是动态IP就比较麻烦,得频繁更新白名单。
第三,走本地代理。在本地起一个nginx或者用node写个简单的代理服务,部署在白名单允许的服务器上,请求先打到代理,代理再转发。不过这属于曲线救国,增加链路复杂度。
第四,本地起一套后端服务。直接连本地后端联调,不走线上接口,彻底避开这个问题。
还有个野路子,如果你能连上服务器的内网,用ssh隧道转发一下也行:
然后请求发到 localhost:8080 就行。
总之别在前端折腾请求头了,那是HTTP层的东西,IP白名单校验在网络层就拦截了,根本轮不到看你的请求头。