我在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错误。我打开了失败的请求跟踪,似乎无法找到更多相关信息。
这可以起作用吗?
答案 0 :(得分:1)
你需要删除&#34;重写https到ws&#34;将协议更改为ws:的规则:在HTTP级别,所有Websocket调用都作为带有Upgrade头的HTTP CONNECT请求开始。您只需要重写此请求,以便将其作为HTTP请求转发到正确的服务器,您已经在&#34;重写ssl到非ssl&#34;规则。