IIS反向代理从其背后的NodeJS获取404

时间:2019-01-29 14:44:02

标签: node.js iis url-rewriting reverse-proxy rocket.chat

我知道有很多关于反向代理的文章,关于InBoundOutBound的事情很多,但是我想知道我做错了什么。

我有http://192.168.0.1:3000上可用的NodeJs服务器 当我通过如下所示的服务器场创建反向代理时

模式*
操作类型: Route To Server Farm
方案: http服务器场: FarmName路径: {R:0}
当我浏览http://localhost时,一切都像一个超级按钮,但是问题是基于子域或子文件夹的请求。

我希望代理http://localhost/site/sub1http://192.168.0.1:3000,我建立了InBoundOutBound规则,如下所示:

<rewrite>
  <globalRules>
    <rule name="ARR_testd_loadbalance" enabled="true" stopProcessing="true">
      <match url="^site/sub1(.*)" />
      <action type="Rewrite" url="http://192.168.0.1:3000/{R:1}" />
      <serverVariables>
        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
        <set name="HTTP_ACCEPT_ENCODING" value="" />
      </serverVariables>
    </rule>
    <rule name="query" stopProcessing="true">
      <match url="^sockjs/(.*)" />
      <action type="Rewrite" url="http://192.168.0.1:3000/sockjs/{R:1}" />
    </rule>
  </globalRules>
  <outboundRules>
    <rule name="RewriteAbsoluteUrlsInResponse" preCondition="ResponseIsHtml1">
      <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://192.168.0.1(\:3000)?/(.*)" />
      <action type="Rewrite" value="/site/sub1/{R:3}" />
    </rule> 
    <rule name="RewriteRelativePaths" preCondition="ResponseIsHtml1">
      <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^/(.*)" negate="false" />
      <action type="Rewrite" value="/site/sub1/{R:1}" />
    </rule>
    <rule name="Restore-AcceptEncoding" preCondition="NeedsRestoringAcceptEncoding">
      <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)"></match>
      <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}"></action>
    </rule>
    <preConditions>
      <preCondition name="NeedsRestoringAcceptEncoding">
        <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+" />
      </preCondition>
      <preCondition name="ResponseIsHtml1">
        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/(.+)" />
      </preCondition>
    </preConditions>
  </outboundRules>
</rewrite>

基于上述规则,我仍然看到来自NodeJs服务器的错误为: 从NodeJS加载页面时,它显示了404错误,例如:

  

错误:404
  糟糕,找不到页面
  抱歉,您请求的页面不存在或已被删除!

在私人Rocket服务器中,我可以看到

  

[34mI20190129-17:17:04.122(3.5)rocketchat:logger server.js:199 [34mMeteor➔方法public-settings / get-> userId:null,参数:[]   [34mI20190129-17:17:04.125(3.5)meteor_autoupdate_clientVersions {id:'TFhMadFtuynon7rHB',clientAddress:'192.168.0.201',httpHeaders:{ referer:'http://localhost/site/sub1 ','x- forwarded-for':'[:: 1]:3704,192.168.0.201','x-forwarded-host':'192.168.0.9:3000','x-forwarded-port':'3000','x- forwarded-proto':'http',主机:'192.168.0.9:3000','user-agent':'Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,like Gecko)Chrome / 70.0 .3538.102 Safari / 537.36 OPR / 57.0.3098.116','accept-language':'en-US,en; q = 0.9'},userId:null}

如果RewriteAbsoluteUrlsInResponseRewriteRelativePaths在工作,为什么我从NodeJS收到404错误?

1 个答案:

答案 0 :(得分:0)

我不知道为什么它真的不起作用, 当我在任意地址*通配符上启用反向代理时,一切工作正常,我认为在ARR模块中发生了某些事情,当我想对site/sub1进行反向工作时,违反了此规则,经过多次尝试,例如Wireshark在私人服务器上查找失败的http请求,定义出站和入站规则等,仍然无法正常工作。

我必须实施一种变通办法以完成上述情况:

在位于以下位置的不同端口8081上建立两个网站:
C:\inetpub\wwwrootC:\inetpub\wwwroot1的第一个是由浏览主站 http://localhost/site,最后http://localhost:81/reversesite可以访问第二个规则,在web.config的{​​{1}}中定义一个反向规则(反向),如下所示:

C:\inetpub\wwwroot1

通过浏览<rewrite> <rules> <rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://192.168.0.1:3000/{R:1}" /> </rule> </rules> </rewrite> ,它将被代理到http://localhost:81,并且没有任何http://192.168.0.1:3000错误。

无论如何,在404中,我可以通过http://localhost/site调用http://192.168.0.1:3000中的任何api或地址,但是当我尝试在http://localhost:81上进行反向操作时,它却无法如前所述有问题。