我知道有很多关于反向代理的文章,关于InBound
和OutBound
的事情很多,但是我想知道我做错了什么。
我有http://192.168.0.1:3000
上可用的NodeJs服务器
当我通过如下所示的服务器场创建反向代理时
模式:*
操作类型: Route To Server Farm
方案: http
,服务器场: FarmName
,路径: {R:0}
当我浏览http://localhost
时,一切都像一个超级按钮,但是问题是基于子域或子文件夹的请求。
我希望代理http://localhost/site/sub1
到http://192.168.0.1:3000
,我建立了InBound
和OutBound
规则,如下所示:
<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}
如果RewriteAbsoluteUrlsInResponse
和RewriteRelativePaths
在工作,为什么我从NodeJS收到404
错误?
答案 0 :(得分:0)
我不知道为什么它真的不起作用,
当我在任意地址*
通配符上启用反向代理时,一切工作正常,我认为在ARR模块中发生了某些事情,当我想对site/sub1
进行反向工作时,违反了此规则,经过多次尝试,例如Wireshark在私人服务器上查找失败的http
请求,定义出站和入站规则等,仍然无法正常工作。
我必须实施一种变通办法以完成上述情况:
在位于以下位置的不同端口80
和81
上建立两个网站:
C:\inetpub\wwwroot
和C:\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
上进行反向操作时,它却无法如前所述有问题。