再遇到老題目:在 IIS 上如何將 HTTP 請求強制導向 HTTPS?
之前試過顯示說明網頁,倒數後透過 JavaScript location.href 轉向 HTTPS 的做法 - 設計賓至如歸的HTTPS強制導向網頁。
但這有個缺點,如果不需要顯示導向提示,則先 HTTP 200 送回正常網頁再由瀏覽器另外發出請求連上 HTTPS 多耗費一次往返,不如直接回傳 HTTP 301/302 導向有效率,而連上 HTTP 時回應 HTTP 200 還可能會被搜尋引擎誤判為有效網址。
網路建議的解法多是使用 URL Rewrite 模組解決,例如保哥強迫網站轉向到 HTTPS 加密安全連線 ( IIS URL Rewrite )一文提到的做法。
之前的情境都是原本 HTTP 舊站啟用 HTTPS 後希望大家改連加密版,這回的狀況是網站一上線就只有 HTTPS,只需將誤連 HTTP 的使用者導向 HTTPS,不需將 HTTP 完整路徑對應成 HTTPS 版本。基於導向入口網頁不需完整對應的單純需求,我找到一個不用安裝 URL Rewrite 的簡便做法。
首先在 IIS 管理員確認勾選「SSL設定 / 需要SSL」,如此連上 HTTP 將得到 HTTP 403.4 錯誤。
接著在「錯誤網頁」指定 403.4 錯誤訊息網頁:
指定自訂錯誤網頁時使用「回應 302 重新導向」並輸入 https: 版首頁。
以上設定也可透過 web.config 加入:
<system.webServer>
<httpErrors>
<errorstatusCode="403"subStatusCode="4"
path="https://www.my-site.com.tw/"responseMode="Redirect"/>
</httpErrors>
</system.webServer>
這方法還有一個小瑕疵,它傳回的是 302(暫時搬移) 不是 301(永久遷移),可能影響搜尋引擎判斷。餏據爬文結果:1) 若原本 HTTP 網址沒有內容,不致有被 Cache 住遲遲沒更新的疑慮 2) 由於業界太多人把 302 當 301 用,Google 已經聰明到將 302 視為 301。參考:302 Redirect vs. 301 Redirect- Which is Better- - Hochman Consultants