-->

开发中如何让本地host和代理共存?

2020-08-10 18:01发布

虽然折腾了很久,但后来发现其实没啥作用。在sso登录页登陆成功后即可设置cookie,这时候回到自己的localhost:8080发出请求也能带上cookie。只要请求的地址符合cookie的domain,后端不验证referer,并且samesite属性设置得没问题。虽然在network中请求头里面看不见cookie,但实际上还是带上了。只是一开始联调不通顺,才以为域名会有影响。

设置一个域名只是方便在浏览器直接查看和删除cookie,除此之外不不影响开发。

总之,还是自己捞了。

但探索过程中还是学到了些东西,就不删原文了。


原文:

开发中若遇到了需要相同域名的情况,比如利用cookie共享的sso策略,可以设置本地host映射到开发服务。设置域名,生效,正常开发。

但在公司中可能是内网,请求都需要经过代理,这时候可能会发现设置host没有作用。

此时可以将代理关掉,但关掉代理,sso的登录页却请求不通,而不用代理通常意味着不能上外网,查资料也不方便。

那么如何让代理和域名共存呢?

太长不看版:

  1. windows电脑中,在ie - 工具 - internert选项 - 链接 - 局域网设置 - 使用自动配置脚本选项下有个地址,通常就是本机使用的代理文件,以pac结尾。复制地址到浏览器,下载之。
  2. 搜索return "DIRECT”,找到直连的那些规则,复制一条,填入自己需要的开发域名。这些规则会直连,则会经过host,所以之后在本地host中设置对应的域名可生效。
  3. 如果ie设置不会定时重置,那么直接将地址填入ie设置中,本地文件地址也行。如果会重置,则使用chrome的Proxy SwitchOmega插件,选项 - 新建情景模式 - 选择pac,将上一步修改的pac文件内容填入,之后选择刚创建的模式。
  4. 前端开发的webpack devServer中需要将域名检测给去掉,使disableHostCheck为true即可。

来龙去脉版:

这里记录一下分析过程和结果。

我们都知道,设置host到自己的开发服务可以误导浏览器让其保留cookie,但如果在公司内网中情况却有些复杂。

一开始有点懵懂,只是简单设置了本地host,结果设置完后发现host没生效。一直在找为啥没生效,查找一番得到一些需要更新缓存的方法。但都实践之后发现没用。

之后求助同事,从同事那里得知是因为内网中,需要把代理关掉才行,不然没法生效。但关掉代理,本地开发虽然可以用域名,但sso的登陆页面没法上,后端服务都没法调用,肯定不行。

之后开始漫长的求解之路。

打开ie设置,找到pac文件地址,放入浏览器地址下载,打算看看是个什么东西。不看不知道,定睛一看还有些熟悉,这不就是js嘛。上网搜了一下pac的语法,大概知道这是一个代理规则定义文件。作用是根据不同的原请求地址来定义不同的请求方式,或者直连,或者转发到不同代理服务。

知道这一点后,我离答案就近了一步。

分析一下,代理服务本质上是个用来转法的服务。它受到请求,解析请求的原目标,然后自己去请求这个目标地址,得到结果之后返回给原请求。正经代理服务的行为大概如此,而开发服务同样可以接收请求并且返回,只是不能转发。

但开发服务不需要转发,那么第一个答案出现了,给pac文件添加一条规则,让域名解析到开发服务。由于开发服务的端口是8080,我则直接转发到了127.0.0.1:8080。如果不填写端口,则默认转法到80端口。

添加之后,保存新文件到本地,填入该地址到ie设置中。尝试用域名请求开发服务,无果。在这里其实犯了个错,只是地址填错了。但当时还以为不支持本地地址,启动了一顿nodejs服务来托管文件。nodejs托管后发现生效,更让我对此深信不疑。总之,这个设置是支持本地地址的。

设置完后还要设置webpack的devServer。

devServer默认会检测域名,用来预防dns rebinding attack,但这里是用不着的,所以可以去掉。设置完后用打开域名发现已生效。填写的域名没加端口,因为按规则直接会转发到8080端口。但webpack的devServer不知道,所以它一直报错,原因是它使用了当前的端口,而当前用域名来访问时让端口不一样了。解决方法也简单,设置中指定port。

这时候几乎可以正常开发,但没过一会儿发现ie设置被系统重置了,改成了之前的远程地址,想必是有个定时任务之类的。想着取消这任务,无果。随后网上找了个修改设置的bat脚本,但实际修改时发现生效很慢,遂放弃。

这时候已经相当郁闷了,搞了半天还是不能舒服开发?

后来翻翻chrome的Proxy SwitchyOmega插件,迎来转机,发现可以创建一个支持pac脚本的模式。填入之前的pac内容后,浏览器就可以忽略系统的pac设置。

这时候,几乎完美了。

但后来打算总结便打算继续看看host为啥不生效,看到有人说并非不生效,而时代理优先级高,发出的请求如果已经被代理规则处理,则通常会转发到明确的服务器,不需要host去解析域名,则使得host看起来未生效。在这个启发下,才找到了pac中直连+设置host的方法。

这个方法优点在于不限定端口,如果有多个开发服务也可以同时满足,并且devServer可以自动寻找端口。总体而言灵活一些 。

标签: