
Я строюExpress.jsapp локально. Чтобы протестировать это на чем-то, кроме 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
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например
- Геккон) Chrome/68.0.3440.106 Safari/537.36
- X-DevTools-Эмуляция-Сетевые-Условия-Идентификатор клиента: 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 г.)законный .dev
общий домен верхнего уровня (gTLD)принадлежит Google. И естьэтот коммит Chromium от 4 января 2018 года, в котором прямо указано:
Preload HSTS for the .dev gTLD.
Как весело! Кроме того,по состоянию на июль 2018 года Firefox тоже это делает.
Самое простое и практичное решение — для тех, кто не хочет настраивать HTTPS для локальной разработки — это использовать другой суффикс, например, .localhost
или даже .local
, честно говоря, что угодно в мире, например *.foobar
и тому подобное.
Но если говорить кратко, то в 2018 году использование *.dev
суффикса для местного развития только вызовет больше непреднамеренных проблем и путаницы, чем что-либо еще.