2016-01-20 117 views
1

我在我們的DMZ中有一個反向代理,它將wss請求轉換爲https(至少從我在IIS日誌中可以看到的內容)。也就是說,JavaScript卻使一個網頁套接字請求通過HTTP的IIS ARR代理WebSockets

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會引發502.2錯誤嘗試將https從ws(無效網關)發送到websockets請求。我打開了失敗的請求追蹤,似乎無法找到更多相關信息。

可以這樣做嗎?

回答

1

您需要刪除「將https重寫爲ws」規則,該規則將協議更改爲ws :.在HTTP級別,所有Websocket調用都以具有Upgrade標頭的HTTP CONNECT請求開始。您只需重寫此請求,以便將其作爲HTTP請求轉發到正確的服務器,您在「重寫ssl到非ssl」規則中已經這樣做了。