如何利用HTTP协议实现HTTP代理?


HTTP代理和正常的HTTP WebServer,二者之间区别如下:

  1. 发送到代理的标头不同。
    1. 例如,以下是谷歌浏览器通过代理服务器向 www.baidu.com 发送的内容:
      1. GET http://www.baidu.com/ HTTP/1.1 Host: www.baidu.com Proxy-Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 DNT: 1 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8
    2. 在这时显示的是GET http://www.baidu.com/ HTTP/1.1而不是GET / HTTP/1.1。Proxy-Connection: keep-alive;Host: www.baidu.com
  2. http 代理需要主机字段。
    1. 对于 HTTPS 隧道代理会显示为
      1. CONNECT comet.zhihu.com:443 HTTP/1.1 Host: comet.zhihu.com:443 Proxy-Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
      2. 此时我们会看得到的结果是CONNECT comet.zhihu.com:443 HTTP/1.1
      3. domain:443而不是https://domain.
      4. CONNECT 字段会将代理服务器变成与 TCP 隧道相似性质的东西并且将协议HTTPS替换为端口:443

对于 Socks5 代理,事情变得容易,因为 Socks5 不关心更高的协议,用户只需提供主机和端口。

简单而言,二者的区别在于在解析请求之后,仅仅只是转发它并返回结果,而不是自己处理请求。因为代理不需要做与普通服务器相同的处理量,它通常可以比一个完整的服务器对请求进行最少的解析,但除此之外是一样的。