IIS ARR Proxy WebSockets через HTTP

У меня есть обратный прокси-сервер в нашей демилитаризованной зоне, который переводит запросы wss в https (по крайней мере, из того, что я вижу в журналах IIS). То есть JavaScript делает запрос через веб-сокет к

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} соответственно.

У меня также есть следующая настройка перезаписи (с наивысшим приоритетом) для обработки этих запросов wss, которые приходят через https (поскольку я могу сказать, какие они основаны на пути):

<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, пытаясь перенаправить запрос веб-сокетов с https на ws (неверный шлюз). Я включил отслеживание неудачных запросов и не могу найти более подходящей информации.

Можно ли заставить это работать?


person Jeff    schedule 20.01.2016    source источник


Ответы (1)


Вам нужно удалить правило «Переписать https в ws», которое меняет протокол на ws:. На уровне HTTP все вызовы Websocket начинают свою жизнь как запрос HTTP CONNECT с заголовком Upgrade. Вам просто нужно переписать этот запрос, чтобы он перенаправлялся на правильный сервер как HTTP-запрос, что вы уже делаете в своем правиле «Переписать ssl на не-ssl».

person Scott    schedule 14.04.2016