在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点
目标:
1.访问www.arrdemo.com/proxy 跳转到 localhost:8898的Nodejs站点
2.Nodejs站点的页面可以返回到浏览器,包括js,css,图片
3.Nodejs站点的 res.redirect(' ') 重定向要正确,包括站内跳转和站外跳转
步骤:
1. 新建站点绑定域名www.arrdemo.com,配置host文件指向本机,新建虚拟目录proxy。
注意去掉虚拟目录->压缩->"启用动态内容压缩"和“启用静态内容压缩” 前面的勾选。否则会出现如下错误:
HTTP 错误 500.52 - URL Rewrite Module Error.
HTTP 响应的内容已编码(“gzip”)时,无法应用出站重写规则。
2.启动Nodejs站点 http://localhost:8898
这个站点是《nodejs开发指南》上的microblog实例,学习过程中改成了Express4.13.1版本。
3.安装ARR,启用Proxy
下载地址(http://www.iis.net/downloads/microsoft/application-request-routing)
安装完成后,打开IIS->选中服务器名称->双击 右侧功能视图 IIS 节点下的Application Request Routing Cache->点击 右侧操作视图Proxy节点下的Server Proxy Settings->勾选上Enable Proxy前面的复选框


4.配置虚拟目录的URL重写规则
在IIS节点,站点节点,虚拟目录节点都可以配置URL重新规则,并且一级级继承。配置完成后信息保存到对应的web.config文件中。所以如果www.arrdemo.com部署在多个服务器上,每个服务器的proxy虚拟目录都需要重定向时可以采取拷贝proxy下的web.config文件的方式快速部署。这里只在proxy虚拟目录下部署,排除继承的影响。
首先,配置入站规则。把http://www.arrdemo.com/proxy/reg 这样的url重写成 http://localhost:8898/reg


双击"URL重写",从入站规则下选择空白规则模板。剩下的注意细看图片注释:




到这一步正常情况下在浏览器里输入http://www.arrdemo.com/proxy,应该可以看到有内容输出了,但是没有任何样式和js效果。如下图:

这是因为入站规则能把请求转发到nodejs里,nodejs返回的html内容再转发到浏览器。但html里的css和js还有图片的路径一般都是相对站点根路径的,不会加上虚拟目录proxy,所以前端看不到任何样式。
这时候该出站规则上场了。。。。。。。
然后,配置出站规则。把http://localhost:8898/bootstrap/..... 这样的url转换成http://www.arrdemo.com/proxy/bootstrap/.....
我这里就拿已经配置好的规则演示了。规则多了分先后顺序,如果匹配上了是否”停止处理“很重要。比如:匹配上两个重新类型的规则,那么就会在输出里出现proxy/proxy的情形,导致出错。

第一个规则 bbbb,处理输出的js、css、图片等路径不对问题。



做完第一个规则,本应万事大吉,只剩喝酒了。然而。。。。然而。。。。。打开网页登陆后跳转到首页的地址变成了 www.arrdemo.com 没有加上proxy。接着下一规则走起。。。
第二个规则处理res.redirect('/'); 这种站内跳转
站内跳转需要在输出时添加proxy,主要是检查 {RESPONSE_STATUS} 变量为302, 然后在 重写时输出 /proxy{R:1},规则如下(请细看图):



这样处理后站内跳转的就没问题了。
第三个规则处理res.redirect('http://www.baidu.com'); 这种站外跳转
跟第二个规则的区别就是这种跳转不做任何操作,直接抛出,规则如下:



现在再去浏览器里访问一下试试吧,如果还不行,请重启站点。
总结:
1.完整的配置文件奉上
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<outboundRules>
<clear />
<rule name="bbbbb" enabled="true" stopProcessing="false">
<match filterByTags="A, Area, Base, Form, Frame, Head, Img, Input, Link, Script" pattern="^(.*)" />
<conditions logicalGrouping="MatchAny" trackAllCaptures="true">
<add input="{URL}" pattern="^/proxy.*" />
</conditions>
<action type="Rewrite" value="/proxy{R:1}" />
</rule>
<rule name="站外重定向" enabled="true" stopProcessing="true">
<match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{RESPONSE_STATUS}" pattern="^302" />
</conditions>
<action type="None" />
</rule>
<rule name="站外跳转2" enabled="true" stopProcessing="true">
<match serverVariable="RESPONSE_LOCATION" pattern="^https://[^/]+/(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{RESPONSE_STATUS}" pattern="^302" />
</conditions>
<action type="None" />
</rule>
<rule name="站内从定向" enabled="true">
<match serverVariable="RESPONSE_LOCATION" pattern="^(.*)" />
<conditions logicalGrouping="MatchAny" trackAllCaptures="true">
<add input="{RESPONSE_STATUS}" pattern="^302" />
</conditions>
<action type="Rewrite" value="/proxy{R:1}" />
</rule>
</outboundRules>
<rules>
<remove name="aaaaa" />
<rule name="aaaaa" stopProcessing="true">
<match url="^(.*)" />
<conditions />
<serverVariables />
<action type="Rewrite" url="http://localhost:8898/{R:1}" logRewrittenUrl="true" />
</rule>
</rules>
</rewrite>
<urlCompression doStaticCompression="false" doDynamicCompression="false" />
</system.webServer>
</configuration>
proxy 下的 web.config
2.查找资料除了百度、必应最应该想到的就是官网帮助文档
每一步操作右侧都有个帮助的链接,点进去是详细的英文文档。

不过也不要完全相信,比如配置重定向跳转时,文档里是这样的:
<outboundRules>
<!-- This rule changes the domain in the HTTP location header for redirection responses -->
<rule name="Change Location Header">
<match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" />
<conditions>
<add input="{RESPONSE_STATUS}" pattern="^301" />
</conditions>
<action type="Rewrite" value="http://{HTTP_HOST}/{R:1}"/>
</rule>
</outboundRules>
我明明感觉应该是302啊,这里为什么是301;还有Rewrite 里那么写真的对吗?我不确定,不过也得到一个思路使用RESPONSE_STATUS变量。
微服务、nodejs好像很火的样子,我也在尝试。希望这篇文章可以让node+nginx实现域名解析的人们多一种解决思路 node+iis+arr实现域名解析。
2018年4月11日更新:
有朋友用Nextcloud+ONLYOFFICE Document Server做了个文档管理云盘系统,通过IIS的反向代理访问,出现了资源链接未替换的错误。他最后找到一种只配置入站规则就可以实现全域名替换的方案,经测试可用。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="INIT_SERVER_VARIABLE_FROM_PROXY" stopProcessing="false">
<match url=".*" />
<serverVariables>
<set name="HTTP_THE_SCHEME" value="{HTTP_X_FORWARDED_PROTO}" replace="true" />
<set name="HTTP_THE_HOST" value="{HTTP_X_FORWARDED_HOST}" replace="true" />
</serverVariables>
<action type="None" />
</rule>
<rule name="INIT_SERVER_VARIABLE_DEFAULT" stopProcessing="false">
<match url=".*" />
<conditions trackAllCaptures="true">
<add input="{HTTPS}s" pattern="on(s)|offs" />
</conditions>
<serverVariables>
<set name="HTTP_THE_SCHEME" value="http{C:1}" replace="false" />
<set name="HTTP_THE_HOST" value="{HTTP_HOST}" replace="false" />
</serverVariables>
<action type="None" />
</rule>
<rule name="DocumentServerRewrite" enabled="true">
<match url="^documentserver-virtual-path(.*)" />
<conditions trackAllCaptures="true">
<add input="{HTTPS}s" pattern="on(s)|offs" />
</conditions>
<serverVariables>
<set name="HTTP_X_FORWARDED_PROTO" value="{HTTP_THE_SCHEME}" replace="true" />
<set name="HTTP_X_FORWARDED_HOST" value="{HTTP_THE_HOST}/documentserver-virtual-path" replace="true" />
</serverVariables>
<action type="Rewrite" url="http://docservice{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
web.config

开博第一篇,推荐、推荐、推荐 一下吧,重要的事情说三遍。
在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点的更多相关文章
- 在IIS7中应用Application Request Routing配置反向代理
配置反向代理软件.zip 开启Proxy项: 该设置表面只有HTTP_HOST为phpweb.leven.com.cn的URL才能通过该规则,如果您绑定了多个域名,可以根据多次增加或者通过正则表达式的 ...
- IIS ARR(Application Request Route)与反向代理(Reverse Proxy)
为何要用反向代理? 这里说说我的场景, 我在服务器上假设了SVN(Visual SVN)用的端口是:8080, 而我想通过输入svn.niusys.com就可以访问我的SVN服务器,也就是要通过80端 ...
- CentOS中实现Nginx负载均衡和反向代理
一.安装必要软件 负载均衡服务器:IP设置为192.168.1.10 Web服务器1:安装Apache或者Nginx,IP设置为192.168.1.11: Web服务器2:安装Apache或者Ngin ...
- docker学习(6) docker中搭建java服务及nginx反向代理
先看下容器规划: 上图中mysql容器的搭建见上篇博客,service1/2为java rest service,创建脚本如下: docker run -d -h service1 \ -v /Use ...
- Nginx中配置http和https做反向代理
参考:http://www.zslin.com/web/article/detail/73 1.安装 sudo apt-get install nginx 2.配置: http_demo.conf # ...
- IIS负载均衡-Application Request Route详解第一篇: ARR介绍(转载)
IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...
- IIS负载均衡-Application Request Route详解第一篇: ARR介绍
IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...
- 无脑无负担网站架构-- Application Request Route的一些应用
首先作为一个.net 程序员,多数情况你懒的整什么架构啊.框架啊.还有那命令行的linux,别说linux也有桌面,那个桌面用起来更让人抓狂,一直不明白居然有人说喜欢上linux的命令行,装B还是SB ...
- NLB+Application Request Route 网路负载均衡
NLB网路负载均衡管理器详解 序言 在上一篇配置iis负载均衡中我们使用啦微软的ARR,我在那篇文章也中提到了网站的高可用性,但是ARR只能做请求入口的消息分发服务,这样如果我们的消息分发服务器给 ...
随机推荐
- [转] Linux学习之CentOS(三十六)--FTP服务原理及vsfptd的安装、配置
本篇随笔将讲解FTP服务的原理以及vsfptd这个最常用的FTP服务程序的安装与配置... 一.FTP服务原理 FTP(File Transfer Protocol)是一个非常古老并且应用十分广泛的文 ...
- 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...
- HL AsySocket 服务开发框架 - 一般性测试1
一 概述 Socket服务器性能要好就要经过无数次的测试,来保证,以下是记录一次的测试经过. 机器配置:Inter(R) Core(TM) i3-2310m CPU 2.10GHz RAM 6.00G ...
- 使用golang 开发的 andriod应用
最近在捣鼓一个东东,就是使用golang开发andriod应用.说起来简单操作起来还挺麻烦,中间又学习了很多东西.比如ubuntu,docker,angular,ionic,jquery mobile ...
- 云计算的三层SPI模型
(转自:http://hi.baidu.com/fengjun8216/item/b15bbef4dcf74049922af27b) 一般而言,云计算架构可以用三层SPI模型来表述. 一.基础设施即服 ...
- JAVA SE 803 考试前突击
考试的宗旨仍然是掌握基础知识,不过鉴于Oracle的这个认证考试还有不少的大家来找茬的成份在,所以一定一定要细心为上. 关于抽象类的坑点集合: 抽象类不是必须得有抽象方法,但有抽象方法的类必须是抽 ...
- WPF打印票据
最近工作的内容是有关于WPF的,整体开发没有什么难度,主要是在打印上因为没有任何经验,犯了一些难,不过还好,解决起来也不是很费劲. WPF打印票据或者是打印普通纸张区别不大,只是说打印票据要把需要打的 ...
- Oracle 行转列总结 Case When,Decode,PIVOT 三种方式 - 转
最近又碰到行专列问题了,当时不假思索用的是子查询,做完后我询问面试管行专列标正的写法应该如何写,他告诉我说应该用"Decode",索性我就总结一下,一共三种方式 --======= ...
- 彻底删除mysql方法
首先,先在服务(开始——>控制面板——>管理工具——>服务)里停掉MySQL的服务.打开控制面板-添加删除程序,找到MySQL,卸载.或者用360安全卫士来卸载也行.也可以用mysq ...
- MarkDown写blog(测试)
区块元素 段落和换行 一个 Markdown 段落是由一个或多个连续的文本行组成,它的前后要有一个以上的空行(空行的定义是显示上看起来像是空的,便会被视为空行.比方说,若某一行只包含空格和制表符,则该 ...