我正在建立一个Express.js应用程序本地运行。为了在 localhost 之外的其他主机上进行测试,我在 hosts 文件中添加了以下条目:
127.0.0.1 mynewapp.dev
甚至没有启动应用程序,我就意外地http://mynewapp.dev:3000
在 Chrome 中尝试了(这是我打算让应用程序运行的地方)。令我惊讶的是,Chrome 将我重定向到https://mynewapp.dev:3000
。
浏览器控制台中的标题显示:
一般的:
- 请求 URL:
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,类似
- Gecko)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 强制使用 HSTS 作为.dev
顶级域名。
作为在这篇博客文章中解释虽然桌面开发人员几乎一直都在使用本地重定向(通过hosts
).dev
,但现在显然(截至 2018 年 5 月)合法的.dev
通用顶级域名 (gTLD)归 Google 所有。还有2018 年 1 月 4 日的 Chromium 提交明确指出:
Preload HSTS for the .dev gTLD.
真有趣!此外,自 2018 年 7 月起,Firefox 也开始这样做。
对于不想为本地开发设置 HTTPS 的人来说,最简单、最实用的解决方案是使用另一个后缀,例如,.localhost
甚至.local
或诚实地说,世界上任何东西,例如*.foobar
等。
但总而言之,在 2018 年,使用*.dev
后缀进行本地开发只会引起比其他任何事情更多的无意的头痛和混乱。