这个标题本身是不合理的,但是基于目前公司有一份系统是外部代理商贴牌使用,有一个老的站点是部署在IIS上,好多代理商自己的域名绑定在这个上面,而近期新版本的系统已经上线,那么需要将这些域名也转发到新的站点上。目前有两个问题:(1)这台服务器无法去安装Nginx,因为需要占用80端口,那么服务器上的所有站点都需要重新配置,我们的业务场景要求我们不能随意停机维护;(2)解析到别的服务器用nginx转发,因为也讲到了,这个站点上绑定了很多自定义的域名,要通知客户去更新解析是一件很难的事情。

这样一来就想到了是否可以用IIS来实现Nginx的功能,经过网络搜索,试验,最终确实可行,以下即为响应的流程:

 

1. 检查IIS是否支持

IIS实现Nginx功能:转发

 

 

 如没有,则先下载ARR 和 URL Rewrite 进行安装,使用过程中发现ARR对IIS的“目录浏览”功能有依赖(未验证,如果无法使用,可以查看一下是否安装了“目录浏览”功能):

【Application Request Routing】 http://www.iis.net/downloads/microsoft/application-request-routing#additionalDownloads

【URL重写】http://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads

 

PS:安装会导致IIS重载,会有那么几秒钟的闪停!!!

 

2. 开始配置

 

双击IIS根目录

 IIS实现Nginx功能:转发

 

双击Application Request Routing Cache

IIS实现Nginx功能:转发

 

双击右边的 Server Proxy Settings

IIS实现Nginx功能:转发

 

 

勾上 Enable proxy

IIS实现Nginx功能:转发

 

取消勾选“Reverse rewrite host in response headers”,否则所有的响应内容的host都会被重写为当前站点域名,简单来讲,最直接的影响就是对外部站点的重定向都会失败,所以这里取消勾选。

 IIS实现Nginx功能:转发

 

点击“应用”后,新建一个站点,用来接受请求做转发

IIS实现Nginx功能:转发

 

双击站点,双击 URL Rewrite -> Add Rules(新建规则) -> Blank rule(空白规则) 

 

IIS实现Nginx功能:转发IIS实现Nginx功能:转发

 

Name:填写你的规则名称

Match URL 是匹配Requested URL的规则

http://www.test.com?name=michael&age=30

host: www.test.com

requested url: ?name=michael&age=30

query string: name=michael&age=30

Requested URL 选择 Matches the Pattern (匹配符合规则的url)

Using 选择 Regular Expressions (使用正则表达式来匹配)

Pattern 里填写 ^(.*) 这里不对正则表达式做讲解,有需要的可以自己了解。

勾选 Ignore case 忽略大小写

IIS实现Nginx功能:转发

 

展开 Conditions 条件筛选

Logical grouping 选择 Match Any

Match All 是列表中所有规则都要匹配才符合(与)

Match Any 是列表中有一个规则匹配就算符合(或)

track capture group across conditions 跟踪捕获组,这个功能跟正则有关,这里不需要不勾选,可以查询关键词 capture group  自行了解详情

IIS实现Nginx功能:转发

 

点击 Add 添加条件 

Condition input 填写  {HTTP_HOST}  ,HTTP_HOST 代表请求头里的host,就是上面例子里的 www.test.com 部分, 更多可过滤条件查询 Server Variables  自行了解

Check if input string 选择 Matches the Pattern 

Pattern 填写 ^arrtest.com$  ,这里的意思是如果host是 arrtest.com 则匹配通过,例:http://arrtest.com?asdf=1234

如果这里填写的是 ^www.arrtest.com$  ,则匹配 http://www.arrtest.com?asdf=1234

勾选 Ignore case 忽略大小写

IIS实现Nginx功能:转发

 

双击展开 Action 部分

Action type 选择 Rewrite 重写转发

Rewrite URL 里填写 https://cn.bing.com/{R:0} 转发目标地址, {R:0} 代表 Match URL 部分匹配到的 Request URL 

勾选 Append query string 追加查询字符串 

IIS实现Nginx功能:转发

 

  

到此配置结束,保存这个规则,在浏览器访问 http://arrtest.com/search?q=测试 就等同于访问 https://cn.bing.com/search?q=测试  

 

PS:“停止处理后续规则”选项可用于多个规则中,比如可以设定某些匹配项,不进行转发,可以勾选该选项

 

为了防止该站点下的其他接口被这个规则无脑转发,我们需要新增一个转发条件

现有的需要转发的 API 格式如下 http://arrtest.com?PROTOID=123456 

其他接口是没有 PROTOID 这个关键词的,并且 PROTOID 后面的value都是数字,那么这里就用这个关键词来过滤需要转发的请求

再回到刚刚的 Conditions 部分,点 Add 新增条件

Condition input 填写 {QUERY_STRING} 

Check if input string 选择 Matches the Pattern

Pattern 填写 PROTOID=\d+ 这个规则的意思是,匹配查询字符串为 PROTOID 开头参数值为数字的请求(例:http://arrtest.com/?PROTOID=456789)

勾选 Ignore case 忽略大小写

IIS实现Nginx功能:转发

 

确定保存,修改 匹配逻辑为 Match All (与),列表内所有的规则都匹配,请求才会通过

IIS实现Nginx功能:转发

 

现在只有 QueryString 为 PROTOID 开头参数值为数字的请求才会被转发了

例子:http://arrtest.com/search?PROTOID=4564&q=测试   =>   http://cn.bing.com/search?PROTOID=4564&q=测试

http://arrtest.com/search?q=测试&PROTOID=4564  则不会被转发 

至此请求转发的功能就实现了,除此之外,强大的 ARR + URL Rewrite 还可以实现高可用负载均衡。

 

相关文章: