我的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"规则中执行。