开发中若遇到了需要相同域名的情况,比如利用cookie共享的sso策略,可以设置本地host映射到开发服务。设置域名,生效,正常开发。
但在公司中可能是内网,请求都需要经过代理,这时候可能会发现设置host没有作用。
此时可以将代理关掉,但关掉代理,sso的登录页却请求不通,而不用代理通常意味着不能上外网,查资料也不方便。
那么如何让代理和域名共存呢?
太长不看版:
来龙去脉版:
这里记录一下分析过程和结果。
我们都知道,设置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可以自动寻找端口。总体而言灵活一些 。
原文:https://www.cnblogs.com/soulsands/p/13200861.html