經過微軟的URL Rewrite組件,實際效果是服務器返回http code 301給瀏覽器,瀏覽器作跳轉。按照上面的文章提到的,在web.config中加入如下rule(或者經過IIS管理器裏的URL Rewrite界面添加rule):html
<rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" /> </rule>
上面的rule也很簡單,(.*)表示全部格式的URL,{HTTPS}表示一個IIS server 變量。全部server變量以及可能的取值在這裏。能夠看到在用http鏈接時,{HTTPS}的取值是字符串「off」。{HTTP_HOST}表示web服務器的名字。前端
方法2在單臺機器部署IIS的狀況下沒問題。可是,當把阿里雲的負載均衡服務SLB扯進來,狀況就有點複雜。web
SLB的背後通常有多臺ECS,若是SLB不開啓HTTPS端口,不在SLB上安裝證書而是在後面的每臺ECS的IIS上安裝證書,開啓IIS的443端口,某些瀏覽器(好比Mac 上的Chorme)會收到證書過時的錯誤。具體緣由還不是太清楚。因此只能用另一套方案:不在每一個ECS的IIS上安裝證書,而是開啓SLB的HTTPS端口,安裝證書。後端
可是在這種方案下,到達SLB的https請求,會被SLB轉換成http請求:瀏覽器
要實現http跳轉到https,咱們多了一個額外的任務:區分到達IIS的http請求,是瀏覽器的http請求(要跳轉到https),仍是SLB的https轉換出來的http請求(不要跳轉,返回網站內容)。想來想去,發現只能經過端口號來區分這2者,具體配置以下:安全
1,ECS的IIS上開放http的80和8123端口,確保與SLB的後端協議端口匹配。服務器
2,SLB上開放兩個監聽端口,前端http 80+後端http 80, 以及前端https 443+後端http 8123。負載均衡
3,URL Rewrite的rule更新成:遇到不是8123端口的http請求就跳轉至https,不然不作跳轉。網站
<rewrite> <rules> <rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)"/> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true"/> <add input="{SERVER_PORT}" pattern="^8123$" negate="true"/> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/> </rule> </rules> </rewrite>
如今整個流程就變成了:瀏覽器請求http 80 -> slb 轉發http 80到ECS的IIS ->URL Rewrite將請求重定向到https->slb 將 https的請求轉換爲http 8123到ECS IIS-> IIS返回真正的網站內容。阿里雲
只是這樣一來,IIS上要額外開一個8123的http端口,在ECS有公網地址的狀況下感受不是太安全,不知道阿里雲後續有沒有更好的解決方案。
點我 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=dg4zrjk6