IIS上的IIS ARR代理WebSockets

时间:2016-01-20 18:21:15

标签: iis websocket reverse-proxy arr

我在DMZ中有一个反向代理,它将wss请求转换为https(至少从我在IIS日志中看到的内容)。也就是说,JavaScript向

发出了websocket请求
wss://cname.domain.com

反向代理将其发送到

https://theserver.local

IIS正在“theserver”上运行,并且具有https绑定。已安装ARR并配置了以下重写规则:

<rule name="Rewrite ssl to non-ssl" stopProcessing="true">
  <condition logicalGrouping="MatchAll" trackAllCaptures="true">
    <add input="{CACHE_URL}" pattern="^(.+):// />
  </condition>
  <match url="the_app/(.*)" />
  <action type="Rewrite" url="{MapProtocol:{C:1}}://theserver.local:8080/{R:1}" />
</rule>

<rewriteMap name="MapProtocol">
  <add key="https" value="http" />
  <add key="wss" value="ws" />
<rewriteMap>

这应该将https和wss传入请求分别路由到路径/ the_app到http://theserver:8080/ {path_and_query_string}和ws:// theserver:8080 / {path_and_query_string}。

我还有以下重写设置(具有最高优先级)来处理通过https传入的这些wss请求(因为我可以告诉它们基于路径):

<rule name="Rewrite https to ws" stopProcessing="true">
  <match url="the_app/websockets/(%7B.+%7D)" />
  <action type="Rewrite" url="ws://theserver:8080/websockets/{R:1}" />
</rule>

重写工作完美...但是,IIS尝试将websockets请求从https路由到ws(无效网关)时抛出502.2错误。我打开了失败的请求跟踪,似乎无法找到更多相关信息。

这可以起作用吗?

1 个答案:

答案 0 :(得分:1)

你需要删除&#34;重写https到ws&#34;将协议更改为ws:的规则:在HTTP级别,所有Websocket调用都作为带有Upgrade头的HTTP CONNECT请求开始。您只需要重写此请求,以便将其作为HTTP请求转发到正确的服务器,您已经在&#34;重写ssl到非ssl&#34;规则。