IIS ARR Proxy WebSockets over HTTP



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

wss://cname.domain.com

反向代理将其发送到

https://theserver.local

IIS 在"服务器"上运行,并具有 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 会引发 502.2 错误,尝试将 websockets 请求从 https 路由到 ws(无效网关)。我已打开失败的请求跟踪,似乎找不到更多相关信息。

这能起作用吗?

您需要

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

相关内容

  • 没有找到相关文章

最新更新