Chrome将我的本地托管网站加载为https而非http,从而导致错误(在ubuntu更新后开始发生)

我有一个我正在处理的本地wordpress项目,并且通常在url栏中键入example.dev打开我的网站,我的网站正在正常显示。

apt-get updateapt-get upgrade我的ubuntu计算机,并请求重启。 重新启动后 – 我尝试打开我的本地网站,我收到一个错误:

无法访问此站点example.dev拒绝连接。 尝试:

检查连接检查代理和防火墙ERR_CONNECTION_REFUSED重新加载详细信息检查Internet连接检查所​​有电缆并重新引导可能正在使用的所有路由器,调制解调器或其他网络设备。 允许Chrome访问防火墙或防病毒设置中的网络。 如果它已被列为允许访问网络的程序,请尝试将其从列表中删除并再次添加。 如果使用代理服务器…请检查代理设置或联系网络管理员以确保代理服务器正常工作。 如果您认为自己不应该使用代理服务器:转到Chrome菜单>设置>显示高级设置…>更改代理设置…并确保您的配置设置为“无代理”或“直接”。

并注意到它为我的网站提供“https”而不是“http”,每当我将“https”编辑为“http”时,按Enter键后仍将其加载为https。

我不太确定这是问题 – 所以我打开了Firefox并做了同样的事情 – 得到了我的网站的正确输出,在开头有“http”而不是“https”。

导致这种情况发生在Chrome中的原因是什么?

我的网站运行在apache2服务器上。 这在更新之前没有发生。

编辑:我遇到过这篇文章 – https://superuser.com/a/1251483/414388并且我真的不明白为什么我需要更改我的域名 – 我真的不想遵循这个方法。 这不是解决方案。

如果您导航到超级用户post中发布的文章,tl; dr解释它:

tl; dr:Chrome 63(自2017年12月起),将强制所有以.dev(和.foo)结尾的域通过预加载的HTTP严格传输安全(HSTS)标头重定向到HTTPS。

因此,您唯一的解决方案是更改为.dev TLD之外的其他内容,或创建证书并在虚拟主机配置中实施HTTPS以进行本地开发。


为了解释为什么这是你唯一的解决方案,我需要从HSTS的含义及其工作原理入手。

HSTS一般

HSTS是一个相对较新的HTTP标头,在设置时会告诉浏览器下次有人导航到域时,只能使用HTTPS访问它,而无需任何服务器端重定向。

例如,让我们考虑您导航到http://example.com 。 在响应标头中,您会收到以下内容:

 Strict-Transport-Security: max-age=31536000 

此标头告诉浏览器,对于下一年(31536000秒),当用户访问http://example.com ,将该URL重定向到本地https://example.com ,而无需任何服务器重定向。 然后,只有通过https://example.com访问该网站。

子域的HSTS

前一个仅对单个域有效。 例如,如果您尝试访问http://subdomain.example.com ,该网站将无需任何重定向即可运行。

要解决此问题,应将前一个标题更改为:

  Strict-Transport-Security: max-age=31536000; includeSubdomains 

现在,即使您从未访问过example.com任何子域,浏览器也会在发出请求之前始终将子域重定向到https。

HSTS预加载

最后一步是解决最后一个问题。 您第一次访问某个站点时,仍然会使用HTTP访问它,这会将您重定向到HTTPS并向您发送HSTS标头。 以前不安全,仍然是一个安全问题。

为解决此问题,主流浏览器使用Chrome的HTTP严格传输安全(HSTS)预加载列表来硬编码只能通过HTTPS访问的域。 您可以在此处找到提交表单: https : //hstspreload.org/

在提交域名之前,您需要做的唯一修改是修改标题,使其在浏览器中缓存至少2年,并为其添加preload选项。

 Strict-Transport-Security: max-age=63072000; includeSubdomains; preload 

提交域名后,一旦发布新版本的Chrome(或任何其他浏览器实施Chrome的HSTS预加载列表,而不一定是下一版本),您的域名将仅作为HTTPS硬编码到Chrome中。

HSTS预加载TLD

允许(并鼓励)TLD的所有者提交其整个TLD以进行HSTS预加载 。

欢迎gTLD,ccTLD或任何其他公共后缀域的所有者在其所有可注册域中预加载HSTS。 这确保了整个TLD的强大安全性,并且比预加载每个域更简单。

由于Google拥有.dev顶级域名,他们就是这么做的。 因此,现在所有*.dev域名仅适用于Chrome下的HTTPS。 由于大多数浏览器使用相同的预加载列表,因此这些浏览器也将停止工作。


如果您搜索预加载的域列表 ( 注意页面超过40MB并且需要一段时间才能渲染。因此,如果计算机不够强大,您的计算机可能会冻结!),您可以发现TLD已预加载: googledevfoopageappchrome

 // eTLDs // At the moment, this only includes Google-owned gTLDs, // but other gTLDs and eTLDs are welcome to preload if they are interested. { "name": "google", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true, "pins": "google" }, { "name": "dev", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, { "name": "foo", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, { "name": "page", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, { "name": "app", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, { "name": "chrome", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, 

如果您没有更改当前.dev域名的选项,可以将Chrome降级到版本61(我已成功做到了=> 此处 )