目标:

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站点的更多相关文章

  1. 在IIS7中应用Application Request Routing配置反向代理

    配置反向代理软件.zip 开启Proxy项: 该设置表面只有HTTP_HOST为phpweb.leven.com.cn的URL才能通过该规则,如果您绑定了多个域名,可以根据多次增加或者通过正则表达式的 ...

  2. IIS ARR(Application Request Route)与反向代理(Reverse Proxy)

    为何要用反向代理? 这里说说我的场景, 我在服务器上假设了SVN(Visual SVN)用的端口是:8080, 而我想通过输入svn.niusys.com就可以访问我的SVN服务器,也就是要通过80端 ...

  3. CentOS中实现Nginx负载均衡和反向代理

    一.安装必要软件 负载均衡服务器:IP设置为192.168.1.10 Web服务器1:安装Apache或者Nginx,IP设置为192.168.1.11: Web服务器2:安装Apache或者Ngin ...

  4. docker学习(6) docker中搭建java服务及nginx反向代理

    先看下容器规划: 上图中mysql容器的搭建见上篇博客,service1/2为java rest service,创建脚本如下: docker run -d -h service1 \ -v /Use ...

  5. Nginx中配置http和https做反向代理

    参考:http://www.zslin.com/web/article/detail/73 1.安装 sudo apt-get install nginx 2.配置: http_demo.conf # ...

  6. IIS负载均衡-Application Request Route详解第一篇: ARR介绍(转载)

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...

  7. IIS负载均衡-Application Request Route详解第一篇: ARR介绍

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍 说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Applica ...

  8. 无脑无负担网站架构-- Application Request Route的一些应用

    首先作为一个.net 程序员,多数情况你懒的整什么架构啊.框架啊.还有那命令行的linux,别说linux也有桌面,那个桌面用起来更让人抓狂,一直不明白居然有人说喜欢上linux的命令行,装B还是SB ...

  9. NLB+Application Request Route 网路负载均衡

    NLB网路负载均衡管理器详解   序言 在上一篇配置iis负载均衡中我们使用啦微软的ARR,我在那篇文章也中提到了网站的高可用性,但是ARR只能做请求入口的消息分发服务,这样如果我们的消息分发服务器给 ...

随机推荐

  1. 【转】安装OpenSSL缺失Microsoft Visual C++ 2008 Redistributables的解决方案

    from: http://www.cnblogs.com/luguo3000/p/3539815.html 在安装OpenSSL的时候通常会提示以下错误: "The Win32 OpenSS ...

  2. Crystal Reports 支持的纸张种类

    DefaultPaperSize Paper10x14 254 x 355.6 mm Paper11x17 279.4 x 431.8 mm PaperA3 A3 ?,297 x 420 mm Pap ...

  3. android 监听软键盘的收起与打开

    参考: http://toughcoder.net/blog/2015/10/09/android-trick-detect-soft-keyboard-show-slash-hide/ packag ...

  4. Carthage 安装和使用

    和Cocoapods相比各有利弊吧,具体对比参见: Carthage 初探:四大优势与四大劣势 第一步:如果没有安装Homebrew先安装 打开命令终端,直接输入以下命令回车 /usr/bin/rub ...

  5. ODAC(V9.5.15) 学习笔记(十八) 数据集缓冲模式

    数据集的缓冲模式(Cached mode)是将数据库服务器的数据缓冲在客户端内存中进行处理,不再依赖服务器.只有当数据需要提交数据库服务器进行保存时,才将变更数据一次性提交数据库服务器. 数据集缓冲模 ...

  6. wireshark解密本地https流量笔记

    此方式支持firefox,chrome 建立path变量 SSLKEYLOGFILE=c:\ssl.key 重启firefox chrome,访问https网站会自动生成ssl session key ...

  7. Maxdos 9.3不能引导系统进入Maxdos

    一.故障描述 最近安装一台新电脑安装的系统版本是windows7_professional_with_sp1_x64,安装完成后想用Maxdos对系统进行备份.出现错误:Warning: the hi ...

  8. IoC控制反转与DI依赖注入

    IoC控制反转与DI依赖注入 IoC: Inversion of Control IoC是一种模式.目的是达到程序的复用.下面的两篇论文是对IoC的权威解释: InversionOfControl h ...

  9. Investigating Your RAM Usage

    转载自:http://developer.android.com/intl/zh-cn/tools/debugging/debugging-memory.html Because Android is ...

  10. 【cs229-Lecture20】策略搜索

    本节内容: 1.POMDP: 2.Policy search算法:reinforced和Pegasus: 马尔科夫决策过程(Partially Observable Markov Decision P ...