使用代理与不使用代理上网的区别
从前端工程师的角度来看,浏览器使用代理和不使用代理访问网络时,有什么区别呢?
1. HTTP Request Line的URI不同
使用代理时,请求行中的URI是完整的url(包含协议主机端口号,称为full URI)。
不使用代理时,请求行中的URI只是url中的pathname+query部分(称为partial URI)。
2. 域名解析
使用代理时,DNS解析交给代理服务器去请求完成。本地的hosts设置对浏览器无影响。
不使用代理时,在本地发出DNS解析请求。本地hosts文件的内容会决定浏览器究竟和哪个ip建立TCP链接。
为什么会有这两个不同之处?
关于第一个:请求行的URI不同的问题。在最初制定HTTP协议时(当时还没有出现虚拟主机和代理服务器的概念)浏览器是直接和web server通信,web server知道自己的scheme、hostname和监听的port,因此浏览器发送的请求行时,方法名后面跟的URI中,就没必要再携带这些信息。
后来HTTP代理出场了,不带scheme、hostname和port的partial URI,就导致了一个问题:代理服务器无法知道http客户端究竟要把请求发送到哪里(由scheme/hostname/port共同确定)。所以HTTP/1.0要求http客户端在有proxy时发送full URI的请求行到代理服务器(在没有proxy设置时,仍旧发送partial URI到web server)。
再到后面虚拟主机(Virtual Host,多个网站部署在同一台物理机上)出现了,它面临类似的问题:物理机需要知道某个partial URI的请求究竟是要交给上面的哪个网站的web server进程处理。由此又导致了另外一个request header出现:Host
,包含hostname和port信息。
关于第二个:URL中的hostname的dns解析问题。使用代理之后,浏览器直接和代理服务器建立TCP链接,然后把full URI的请求扔给代理服务器,然后等着代理服务器从web server拿到响应之后转给浏览器。所以浏览器本地配置的hosts,对浏览器而言根本不起作用(除非代理服务器和浏览器在同一台机器上),因为dns解析的工作由代理服务器去做了。
花絮
最后,还是附上参考链接吧:HTTP: The Definitive Guide, chapter 6. Proxies
这篇post里面除了图是我亲自截的以外,其他基本上都是我看书翻译的。。。
这个确实和工作相关,特别是在本地搭建开发调试环境和iPad调试环境,都会涉及到代理和hosts,所以就写下来了。
还有那什么,经典的前端面试题:一个页面从输入URL到页面加载完的过程中都发生了什么事情
,很多牛人bla bla bla地写了一大坨。其实如果浏览器设置了代理,那这问题就稍微容易回答些了。
blog comments powered by Disqus