即使本機開發伺服器未處於活動狀態,出於開發目的新增至主機檔案中的假「.dev」網域也會在 Windows 上的 Chrome 中重新導向到 HTTPS

即使本機開發伺服器未處於活動狀態,出於開發目的新增至主機檔案中的假「.dev」網域也會在 Windows 上的 Chrome 中重新導向到 HTTPS

我正在建造一個Express.js本地應用程式。為了在本地主機以外的其他地方測試這一點,我將以下條目添加到我的主機檔案中:

127.0.0.1       mynewapp.dev

我什至沒有啟動應用程序,就意外地http://mynewapp.dev:3000在 Chrome 中嘗試了(這是我打算運行應用程式的地方)。令我驚訝的是,Chrome 將我重定向到了https://mynewapp.dev:3000.

瀏覽器控制台中的標題顯示:

一般的:

  • 請求網址:http://mynewapp.dev:3000/
  • 請求方式:GET
  • 狀態碼:307 內部重定向
  • 推薦人政策:降級時無推薦人

響應標頭:

  • 地點:https://mynewapp.dev:3000/
  • 非權威原因:HSTS

請求標頭:

  • 顯示暫時標題
  • 升級不安全請求:1
  • 使用者代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,例如
  • 壁虎)Chrome/68.0.3440.106 Safari/537.36
  • X-DevTools-模擬-網路-條件-客戶端-Id:23A0CBD658A51DF4CA3B25A263078DA4

這怎麼發生的?我沒有軟體重定向請求,而且我的應用程式甚至沒有運行!

我在用:

  • Chrome 版本 68.0.3440.106(官方版本)(64 位元)
  • Windows 10 企業版

然而,這不會發生在:

  • Microsoft Edge 40.15063.674.0(顯示錯誤代碼:INET_E_RESOURCE_NOT_FOUND)
  • IE 11(顯示錯誤代碼:INET_E_RESOURCE_NOT_FOUND)

回答評論:

  • curl -I http://mynewapp.dev:3000卡住並且什麼也不顯示。
  • 我也嘗試了一下chrome://net-internals/#events,找到了要求。這就是我所看到的:

    100382: URL_REQUEST
    http://mynewapp.dev:3000/
    Start Time: 2018-08-17 07:32:03.853
    
    t=16751 [st=   0] +REQUEST_ALIVE  [dt=1007]
                       --> priority = "HIGHEST"
                       --> url = "http://mynewapp.dev:3000/"
    t=16751 [st=   0]   +URL_REQUEST_DELEGATE  [dt=1]
    t=16751 [st=   0]      DELEGATE_INFO  [dt=1]
                           --> delegate_blocked_by = "extension AdBlock"
    t=16752 [st=   1]   -URL_REQUEST_DELEGATE
    t=16752 [st=   1]   +URL_REQUEST_START_JOB  [dt=6]
                         --> load_flags = 18432 (MAIN_FRAME_DEPRECATED | MAYBE_USER_GESTURE)
                         --> method = "GET"
                         --> url = "http://mynewapp.dev:3000/"
    t=16752 [st=   1]      URL_REQUEST_REDIRECT_JOB
                           --> reason = "HSTS"
    t=16752 [st=   1]      URL_REQUEST_FAKE_RESPONSE_HEADERS_CREATED
                           --> HTTP/1.1 307 Internal Redirect
                               Location: https://mynewapp.dev:3000/
                               Non-Authoritative-Reason: HSTS
    t=16752 [st=   1]     +URL_REQUEST_DELEGATE  [dt=6]
    t=16752 [st=   1]        DELEGATE_INFO  [dt=6]
                             --> delegate_blocked_by = "MojoAsyncResourceHandler"
    t=16758 [st=   7]     -URL_REQUEST_DELEGATE
    t=16758 [st=   7]      URL_REQUEST_REDIRECTED
                           --> location = "https://mynewapp.dev:3000/"
    t=16758 [st=   7]   -URL_REQUEST_START_JOB
    t=16758 [st=   7]   +URL_REQUEST_DELEGATE  [dt=0]
    t=16758 [st=   7]      DELEGATE_INFO  [dt=0]
                           --> delegate_blocked_by = "extension AdBlock"
    t=16758 [st=   7]   -URL_REQUEST_DELEGATE
    t=16758 [st=   7]   +URL_REQUEST_START_JOB  [dt=1000]
                         --> load_flags = 18432 (MAIN_FRAME_DEPRECATED | MAYBE_USER_GESTURE)
                         --> method = "GET"
                         --> url = "https://mynewapp.dev:3000/"
    t=16759 [st=   8]      URL_REQUEST_DELEGATE  [dt=0]
    t=16759 [st=   8]      HTTP_CACHE_GET_BACKEND  [dt=0]
    t=16759 [st=   8]      HTTP_CACHE_OPEN_ENTRY  [dt=0]
                           --> net_error = -2 (ERR_FAILED)
    t=16759 [st=   8]      HTTP_CACHE_CREATE_ENTRY  [dt=0]
    t=16759 [st=   8]      HTTP_CACHE_ADD_TO_ENTRY  [dt=0]
    t=16759 [st=   8]     +HTTP_STREAM_REQUEST  [dt=999]
    t=16759 [st=   8]        HTTP_STREAM_JOB_CONTROLLER_BOUND
                             --> source_dependency = 100392 (HTTP_STREAM_JOB_CONTROLLER)
    t=17758 [st=1007]        HTTP_STREAM_REQUEST_BOUND_TO_JOB
                             --> source_dependency = 100393 (HTTP_STREAM_JOB)
    t=17758 [st=1007]     -HTTP_STREAM_REQUEST
    t=17758 [st=1007]   -URL_REQUEST_START_JOB
                         --> net_error = -102 (ERR_CONNECTION_REFUSED)
    t=17758 [st=1007]    URL_REQUEST_DELEGATE  [dt=0]
    t=17758 [st=1007] -REQUEST_ALIVE
                       --> net_error = -102 (ERR_CONNECTION_REFUSED)
    
  • 清除主機快取chrome://net-internals/#dns。不工作。
  • 停止所有 Chrome 擴充功能。行為沒有改變。

答案1

從 2018 年開始,Chrome 和 Firefox 現在強制對.dev頂級網域使用 HSTS。

作為這篇文章中解釋了,雖然桌面開發人員幾乎一直在使用本地重定向(通過hosts.dev,但現在顯然是如此(截至 2018 年 5 月)合法的.dev通用頂級域名 (gTLD)歸谷歌所有。並且有2018 年 1 月 4 日的 Chromium 承諾明確指出

Preload HSTS for the .dev gTLD.

多有趣!此外,截至 2018 年 7 月,Firefox 也這麼做了

對於任何不想為本地開發設定 HTTPS 的人來說,最簡單、最實用的解決方案是使用另一個後綴,例如.localhost或 甚至.local或老實說世界上任何東西,例如*.foobar等等。

但總而言之,在2018年,使用*.dev後綴進行本地開發只會比其他任何事情都帶來更多不經意的頭痛和混亂。

相關內容