分兩種情況。
第一種是會發起一次 HTTP 以及一次 HTTPS:當你訪問 HTTP URL,會發起一個普通的 HTTP 請求,服務器通過某些配置,會返回一個 301 狀態碼,並 Location 到對應的 HTTPS URL 上。瀏覽器接着重定向,發起 HTTS 請求。需要補充的是,當你后面再次訪問這個 HTTP 請求時,因為存在瀏覽器緩存,可能直接在瀏覽器端就重定向了,這樣的話只有一個 TCP 請求。
不過由於 HTTP -> HTTPS 重定向的過程是存在安全隱患的,中間人可以以這個 HTTP 請求為突破口,讓你的 HTTPS 無用武之地。
因此大家搞了一個協議,叫做 Strict-Transport-Security (HSTS)。大致意思是如果服務器在 HTTPS 請求里返回了 Strict-Transport-Security
響應頭,那么后面瀏覽器只能通過 HTTPS 請求訪問這個域名的 URL。如果用戶訪問了對應的 HTTP URL,瀏覽器會自動切換到 HTTPS URL,只會有 443,沒有 80.
不過理論上這樣也有隱患,那就是第一次訪問某個域名,而且使用的又是 HTTP,瀏覽器沒有相應的 HSTS 記錄,所以還是會發起一次 HTTP 請求,如果正好這個時候有中間人,就不安全了。所以 Chrome 等瀏覽器還會預置一批 HSTS 域名名單。