主题行几乎说明了一切。当您在 URL 栏中输入没有HTTP/HTTPS 前缀的网站 URL 时,我认为 Chrome 总是更喜欢 HTTPS,或者使用历史记录/书签作为指导来决定使用哪个。
但是,我有一个站点(以及较旧的、使用 mediawiki 的站点)同时具有 HTTP 和 HTTPS 版本,尽管我删除了所有 HTTP 历史条目和书签,并且有许多 HTTPS URL 的历史条目/书签,但 Chrome 总是为其选择 HTTP在那个网站上。
很明显,该网站有一些东西让 Chrome 选择了 HTTP:谁能解释 Chrome 是如何做出这个决定的?
过去的默认值一直是 HTTP ——而今天的默认值仍然是 HTTP,除非浏览器记得该域有一个HSTS策略,它对所有请求强制执行 HTTPS(即使您手动输入 http://)。
(Chrome 包含一个“预加载”HSTS 域列表,这些域始终使用 HTTPS,无一例外。其他域可以通过发送特殊的Strict-Transport-Security标头来动态选择加入 - 当您第一次通过 HTTPS 访问此类站点时,浏览器会锁定它进入HSTS模式。)
此外,许多网站提供的 HTTP 版本总是使用301“永久移动”或其他类似的重定向代码将访问者重定向到 HTTPS。即使没有设置 HSTS,“永久”重定向也会存储在浏览器的缓存中,这也可能导致请求直接转到“新”URL(尽管这是每页,而不是每域)。
这两种方法都会导致 URL 栏最终包含一个“https://”地址,尽管在幕后它们的工作方式不同——HSTS 策略在本地应用(不会发生纯文本请求),而重定向是由服务器应用的(并且容易被欺骗)。大多数网站结合了这两种方法。
Apache 或 Nginx 配置告诉浏览器它们应该使用 http 还是 https。
编辑:具体来说,Apache 和 Nginx 虚拟主机决定了域是否将具有 SSL。如果您在第一次通过 http 加载网站时打开浏览器并查看 Chrome 中的网络选项卡,您通常会看到如果域具有 SSL,则第一个请求通常是 301 重定向。
浏览器使用域名通过分布式DNS服务器连接到服务器。一旦请求到达主机服务器,就会加载 Apache 或 Nginx 配置文件指令。然后将域与配置中的虚拟主机进行比较,如果域匹配一个,指令会告诉浏览器使用哪个端口。一般443端口是https,80端口是http。
下面是 VirtualHosts 的外观 (Apache) 以及它在主机服务器上的设置方式:
https://serverfault.com/questions/744960/configuring-ssl-with-virtual-hosts-under-apache-and-centos
(忽略问题并查看接受的答案)
编辑2:我忘记了其他东西。同时拥有 https 和 http 虚拟主机不会自动强制重定向。网站可以通过两者加载。重定向通常是通过
.htaccess
apache 中的规则或 nginx 中的指令来设置的,这些指令会根据管理员的偏好来强制重定向。所以我下面的评论有些错误。