43

与实现 HTTP 网络服务器相比,如何实现 HTTP 代理,有什么区别?有没有关于这个主题的权威指南或 RFC 或有用的书?

4

3 回答 3

48

发送到代理的标头不同。

例如,以下是谷歌浏览器通过代理服务器向 www.baidu.com 发送的内容:

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

我们可以看到它是

GET http://www.baidu.com/ HTTP/1.1

代替

GET / HTTP/1.1

这是

Proxy-Connection: keep-alive

Host: www.baidu.com

http 代理需要主机字段。

对于 HTTPS 隧道代理:

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

我们可以看到

CONNECT comet.zhihu.com:443 HTTP/1.1

domain:443而不是https://domain.

CONNECT 字段将代理服务器变成类似 TCP 隧道的东西,然后将协议HTTPS替换为端口:443

对于 socks5 代理,事情变得容易,因为 socks5 不关心更高的协议,你只需告诉它主机和端口。

于 2016-07-08T04:50:04.500 回答
23

HTTP 代理服务器的要求在

于 2011-09-28T04:01:31.150 回答
8

代理与服务器非常相似。唯一的区别是,在解析请求之后,它只是转发它并返回结果*,而不是自己处理请求。因为代理不需要做与普通服务器相同的处理量,它通常可以比完整的服务器对请求进行最少的解析,但除此之外它是相同的想法。

*一些代理实现额外的缓存。有些人还对响应/请求感到不满,但那是一种邪恶的代理,希望你没有想到。

于 2011-09-28T03:28:03.527 回答