目标:

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. Linux查看端口、进程情况及kill进程

    看端口: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat –apn 查看所有的进程和端口使用情况.发现下面的进程列表,其中最后一栏是P ...

  2. VS替换空行

    visual studio2012 改变了正则表达式的写法 因此原来的不管用了 Old: ^:b*$\n New: ^(?([^\r\n])\s)*\r?$\r?\n Click Ctrl-H (qu ...

  3. Openvswitch原理与代码分析(1):总体架构

      一.Opevswitch总体架构   Openvswitch的架构网上有如下的图表示:       每个模块都有不同的功能 ovs-vswitchd 为主要模块,实现交换机的守护进程daemon ...

  4. ubuntu tomcat 部署java web

    1,安装jdk apt-get install openjdk-7-jdk 2,下载tomcat.解压到对应的文件夹 3,将xxx.war放入到 tomcat下的  webapp目录下(此目录下不要有 ...

  5. VS2012文本编辑器鼠标不能滚动

  6. 【转】sql里面的split

    CREATE function [dbo].[SplitString]( @Input nvarchar(max), @Separator nvarchar(max)=',', @RemoveEmpt ...

  7. WordPress博客搬家注意事项

    博客域名还有一段时间就到期了,准备更换域名和空间,会出现一些问题,我这里在网上收集整理了一下,基本上会遇到两个重要的问题. 首先第一个问题就是数据的搬迁中出现的错误. 我这里用的是phpmyadmin ...

  8. mysql 性能优化 配置优化

    http://download.csdn.net/album/detail/1397/2

  9. asp.net mvc 利用过滤器进行网站Meta设置

    过去几年都是用asp.net webform进行开发东西,最近听说过时了,同时webform会产生ViewState(虽然我已经不用ruanat=server的控件好久了 :)),对企业应用无所谓,但 ...

  10. 实现无锁的栈与队列(5):Hazard Pointer

    两年多以前随手写了点与 lock free 相关的笔记:1,2,3,4,质量都不是很高其实(读者见谅),但两年来陆陆续续竟也有些阅读量了(可见剑走偏锋的技巧是多容易吸引眼球).笔记当中在解决内存释放和 ...