当我在Chrome浏览器中输入google.com(注意,我没有指定它是http还是https),它会自动转到https://google.com,它是一个连接到443端口的安全套接字连接。那么,我的问题是,我的浏览器如何知道它应该连接到443而不是80?或者更简单地说,我的浏览器如何知道google.com使用安全套接字进行http通信?
当我在Chrome浏览器中输入google.com(注意,我没有指定它是http还是https),它会自动转到https://google.com,它是一个连接到443端口的安全套接字连接。那么,我的问题是,我的浏览器如何知道它应该连接到443而不是80?或者更简单地说,我的浏览器如何知道google.com使用安全套接字进行http通信?
HTTP协议!
Chrome默认添加http://前缀,将http://google.com请求发送到HTTP端口:
GET / HTTP/1.1
Host: google.com
...
HTTP/1.1 301 Moved Permanently
Location: https://google.com
...
注意Location header中的https。
然后Chrome会自动处理重定向,并将第二个请求发送到HTTPS端口。
GET / HTTP/1.1
Host: google.com
...
HTTP/1.1 200 OK
....
浏览器通常首先尝试HTTP,然后获取到一个重定向到HTTPS。这是常见情况,但并非唯一情况。Chrome和Firefox支持 HTTP Strict Transport Security Preload Lists
的概念,这是一个网站列表,只能通过HTTPS进行访问,即使使用HTTP URL引用。
您可以在 此处 了解更多关于HSTS的内容。