在阿里雲SLB下如何實現IIS->http自動轉向https

經過微軟的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

相關文章
相關標籤/搜索