Contents

Chrome 莫名其妙 localhost 會導到 HTTPS

上次在本機用 mkcert 搭配 Vite 架過 HTTPS,當時一切正常。結果後來我把開發站切回 HTTP,Chrome 卻還是硬把 localhost 導去 HTTPS,一開始只能靠無痕視窗暫時繞過,後來才認真查清楚,根本原因大多跟 HSTS 有關。

問題現象

最常見的樣子就是:

  1. 你明明輸入 http://localhost:5173
  2. 瀏覽器卻自動跳成 https://localhost:5173
  3. 因為現在本機沒開 HTTPS,所以最後直接連線失敗。

https://i.imgur.com/eTggfqk.png

為什麼會這樣

這通常不是你的 Vite、Express 或 Node 伺服器突然發神經,而是瀏覽器記住了某個網域應該強制走 HTTPS。這個機制就是 HSTS。

HSTS 原本是安全功能,避免使用者被降級攻擊導回 HTTP。但在本機開發時,如果你曾經讓 localhost 或特定測試網域走過 HSTS,後面改回 HTTP 就會很煩。

解法

我當時是用 Chrome 內建頁面清掉 HSTS 記錄。

參考資料:

步驟

  1. 在 Chrome 輸入 chrome://net-internals/#hsts
  2. 查詢目前的 domain 是否有被記錄。
  3. 直接把該 domain 刪掉。

https://i.imgur.com/UYW2UK2.png

刪掉之後,我這邊就恢復正常了。

小提醒

  1. localhost 只是常見案例,內網測試網域也可能有一樣問題。
  2. 如果你是換瀏覽器正常、只在某個 profile 有事,通常就更像是瀏覽器本地狀態問題。
  3. 新版 Chrome 介面有時會調整,找不到舊頁面時可以再查新版 HSTS 清除方式。

我的心得

以前遇到這種自動導 HTTPS,第一直覺都會先怪開發 server。但這類問題其實很多是瀏覽器「記太多」。只要近期有玩過 mkcert、本機 HTTPS、反向代理,看到 localhost 突然被強制導 HTTPS,先懷疑 HSTS 通常比較快。