再遇到老題目:在 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>
            <error statusCode="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


Comments

# by 接手老專案的菜鳥

黑大:我有裝UrlRewrite 模組,真實程式路徑是https://www.aaa.com/OLD/123.php?id=參數值 我想讓前臺統一變成www.AAA.com/NEW/參數值,請問該怎麼改,才可以正常呈現? <rewrite> <rules> <rule name="OLD to NEW redirect" stopProcessing="true"> <match url="(https://www.aaa.com/OLD/123.PHP?id=" /> <conditions> <add input="{https://www.aaa.com/NEW/{R:1}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" redirectType="Found" url="https://www.aaa.com/NEW/{R:1}" /> </rule> </rules> </rewrite>

# by Jeffrey

to 接手老專案的菜鳥,action中的{R:1}要對應match中的正則表達式的第一個群組,若我沒理解錯,應該寫成這樣好 <rule name="Rewrite"> <match url="^OLD/123.PHP(.*)" /> <action type="Redirect" url="NEW/{R:1}" /> </rule> 參考:https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

Post a comment