公司旁边项目组是用.net 和 F#开发的,他们最近要把基于 nginx 的负载切换到 iis 上面去,但是一直有很多接口不通。由于涉及到我提供的服务,所以不得不参 与到问题的解决中来。
安装准备
不能免俗的是下载安装 ARR(Application Request Routing),下载地址为: http://www.iis.net/downloads/microsoft/application-request-routing。
安装完成后,在 iis 面板中会多出两个图标,分别是 Application Request Routing 和 URL 重写。
这两个图标就是代理的核心。
设置
Application Request Routing
设置在右侧 Server Proxy Settings 里,将代理功能开启,如下图:
设置 URL 重写
在设置 URL 重写之前需要先创建站点如下:
物理路径中是静态文件的地址,前后端分离的项目中这里是前端页面的地址。绑定和主机名中填写好监听的端口和网站地址。
点击确定后,在左侧会多出一个网站:
下面就可以开始配置端口路由了,也就是 URL 重写。
点击 URL 重写图标,新建空白规则,进行设置如下:
这里需要注意的有以下两点:
- 这里的匹配 URL 中的内容时,匹配的是 host 和端口之后不以/开头的部分,比如请求是http://abc.com/third/calendar,那么这里匹配的是third/calendar部分
- 正则表达式和通配符的匹配效果是不一样的,可以自己尝试。另外可以通过测试来确定下面的重写中是用 R:0 还是 R:1...
重写配置:
这里的 R:0 与 R:1,R:N 都是根据上面的测试结果来的。
条件的配置:
- 一般情况有上面的配置就能满足需求了,但是如果需要加一些特别的配置,可以在这里添加,这里需要注意的一点是在配置{URL}的匹配时,这里的 URL 是以/开头的,这点和上面的 URL 匹配是不同的,也就是请求是http://abc.com/third/calendar,那么这里匹配的是/third/calendar部分
- {HTTP_HOST}意思是请求的主机名,模式格式为:“^绑定的域名$”
- 这里校验规则时也有一个测试的部分,测试的结果是 C:N,建议还是在使用之前用路径来匹配测试一下。
这里需要注意的是如果配置的有多条规则,重写部分的停止继续往下匹配的那一项要选中,这样它匹配到前面的之后就不会继续往下匹配了,否则还会往下穿透。
问题与解决
现在准备工作都做好了,可以来聊一聊问题了。问题是在前端访问时,在有些页面内的访问时通的,在有些页面一直是不通的,于是开始了漫长的寻找问题之旅,因为之前使用的是 nginx,而大家也都没有使用 iis 的经验。直到最后,使用 www.abc.com/third/xxx/xxx 来访问时是可以通的,但是使用 abc.com/third/xxx/xxx 来访问时是 404。一个同事查了半天总以为是 iis 配置的问题,最后也未能解决。因为涉及到我这边的服务,所以临时来协助下。
一开始怀疑是 hosts 的配置问题,但转念一想,iis 是代理,加了代理之后应该是优先于 hosts 的。实际上改了 hosts 也未能解决问题。
后来想到了建站时的绑定设置,iis 应该是无法识别 www.abc.com 与 abc.com 其实是相同的,绑定如下:
发现是可以添加多个的,于是添加一个 abc.com 如下:
重启生效后,问题解决。
总结
可能是对 iis 不是很熟悉,但是实际的解决问题的思路是一样的。两种路径请求的结果不一样时,应该多做比较,多联想。也算是着实被 iis 坑了一把,但解决问题的过程中也学会了挺多东西。