开发中若遇到了需要相同域名的情况,比如利用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可以自动寻找端口。总体而言灵活一些 。

开发中如何让本地host和代理共存?的更多相关文章

  1. iOS - 开发中加载本地word/pdf文档说明

    最近项目中要加载一个本地的word/pdf等文件比如<用户隐私政策><用户注册说明>,有两种方法加载 > 用QLPreviewController控制器实现 步骤 : & ...

  2. Ios开发中UILocalNotification实现本地通知实现提醒功能

    这两天在做一个日程提醒功能,用到了本地通知的功能,记录相关知识如下: 1.本地通知的定义和使用: 本地通知是UILocalNotification的实例,主要有三类属性: scheduled time ...

  3. javascript设计模式与开发实践阅读笔记(6)——代理模式

    代理模式:是为一个对象提供一个代用品或占位符,以便控制对它的访问. 代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对 ...

  4. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  5. 在 Windows10 系统中安装 Homestead 本地开发环境

    在 windows10 系统中安装 homestead 本地开发环境 在 windows10 环境下安装 homestead 开发环境,网上有很多相关教程其中大多都是 mac 环境,很多大神都是用户的 ...

  6. C#开发中使用配置文件对象简化配置的本地保存

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  7. Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  8. iOS开发 中的代理实现

    iOS开发 中的代理实现 关于今天为什么要发这篇文字的原因:今天在和同事聊天的时候他跟我说项目中给他的block有时候不太能看的懂,让我尽量用代理写,好吧心累了,那就先从写个代理demo,防止以后他看 ...

  9. iOS开发中打开本地应用、打开appStore应用、给app评分功能实现

    app开发中,通常会有邀请用户给app打分的功能.而在iOS中,正式应用都是通过appStore 下载的,因此给app 打分也只能在 appStore中.因此,需要从应用跳转到appStore.方法是 ...

随机推荐

  1. 8.0 以上版本 mySQL数据库导致的命令行可连接,NaviCat不可连接的问题

    错误代码: client does not support authentication 原因: 没有开启Mysql的远程连接配置 解决办法: 1 使用命令行进入数据库 C:\Users\wushao ...

  2. Java实现 LeetCode 168 Excel表列名称

    168. Excel表列名称 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -&g ...

  3. java实现蓝桥杯密码脱落

    一 问题描述 X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远 ...

  4. java实现排他平方数

    题目标题: 排它平方数 小明正看着 203879 这个数字发呆. 原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位 ...

  5. svg 贝塞尔曲线图解(记录)

    path路径绘制中,绘制贝塞尔曲线的命令包括: Q 二次贝赛尔曲线 x1,y1 x,y T 平滑二次贝塞尔曲线 x,y C 曲线(curveto) x1,y1 x2,y2 x,y S 平滑曲线 x2, ...

  6. iOS-地图定位 && 解码与反解码

             前段时间,公司开发的App用到了地图和定位,所以记录一下,作为回顾总结.     对于地图和定位,苹果公司提供给了两个框架: MapKit:用于地图展示 Core Location ...

  7. 心有 netty 一点通!

    一.标准的netty线程模型 双池合璧: 1.连接线程池: 连接线程池专门负责监听客户端连接请求,并完成连接的建立(包括诸如握手.安全认证等过程). 连接的建立本身是一个极其复杂.损耗性能的过程,此处 ...

  8. 如何打包发布加密的 Python 源代码

    这里介绍一种使用 PyInstaller 和 PyArmor 来发布加密 Python 源代码的方式,能够达到以下目的 把所有 Python 源代码打包成为可执行文件,客户不需要 Python 就可以 ...

  9. fastjson对String、JSONObject、JSONArray相互转换

    String——>>>JSONArray String st = "[{name:Tim,age:25,sex:male},{name:Tom,age:28,sex:mal ...

  10. IDEA Gradle项目控制台输出乱码

    idea 更新到2019.2.3没有这个选项. 可以点击 help->edit custom vm options 然后加上 -Dfile.encoding=utf-8 重启一下就好了