最近在做小程序的項目,微信要求所有數據請求通道都要走https或wss。而我們的項目建設如下:
api基於C#的MVC webapi開發。
websocket基於Nodejs的thinkjs框架開發。
因此會導致一個要求,就是api暫時不支持.net core,因此只能部署在windows下,使用IIS作為web服務器。又因為IIS占用了80端口,因此沒法用nginx作為反向代理。
經過一番研究后發現,IIS8以上版本可以作為反向代理服務器。因此只要將IIS作為反向代理服務器,將SSL證書和域名綁定到IIS上,再通過IIS新增的URL重寫模塊將請求轉向給內部的websocket服務就可以了。
具體操作如下:
一、下載ARR
下載地址:http://www.iis.net/downloads/microsoft/application-request-routing
下載完后無腦點擊運行,一直點下一步就可以了。
二、啟動Proxy
三、新增反向代理服務器,設置方向代理URL重寫規則
在IIS中新增一個網站,然后點擊URL重寫模塊。在右側點擊【添加規則】--【入站規則】 -- 【空白規則】
將URL的匹配模式設置成^(.*),再將重寫URL設置成:http://localhost:8361/{R:1}
舉個例子:
入站前:http:www.beta.com/?params=1
重寫后:http://localhost:8361/params=1
這樣通過這個規則,可以將URL從域名轉換成內部的局域網URL
四、設置websocket重寫規則
在步驟三中,可以通過反向代理服務器將外部訪問的URL請求轉成內部的URL請求。
但是,別忘記我們這個是一個websocket專用的反向代理服務器。
而websocket在請求的時候,不是http://開頭,而是以ws://開頭。因此我們要重新配置一下。
在條件中加入以下配置:
同時將重寫URL改成:
這么些是什么意味呢?
就是說如果是http請求:
入站前:https:www.beta.com/?params=1
重寫后:http://localhost:8361/params=1
如果是ws請求:
入站前:wss:www.beta.com/?params=1
重寫后:ws://localhost:8361/params=1
這樣既能應對http請求的URL轉換,又能應對websocket的URL轉換。
心細的朋友可能是注意到,為什么要將https轉成http,將wss轉成ws。
這就回到問題的原點,因為小程序的請求規則里要求,所有數據請求通道都要走https或wss。所謂外部過來的請求必然要帶https或wss。但是內部處理的時候又不需要帶SSL認證,因此需要將頭里面的s給去掉。
五、綁定SSL證書和域名
此時,我們只要將SSL證書和域名綁定到代理服務器上就行了。具體就不多說了。
只是有一點要特別注意一下,因為IIS只支持一個SSL,多個網站綁定不同的SSL證書時會導致443端口沖突。因此在綁定https的時候,一定要記得勾選。