HTTP代理如何使用HTTP协议?代理RFC?

uni*_*n83 29 proxy http http-proxy

与实现HTTP Web服务器相比,如何实现HTTP代理,有何区别?是否有关于此主题的权威指南或RFC或有用的书籍?

小智 28

发送给代理的标头是不同的.

例如,以下是Google Chrome通过代理服务器发送给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
Run Code Online (Sandbox Code Playgroud)

我们可以看到它

GET http://www.baidu.com/ HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

代替

GET / HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

这是

Proxy-Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)

Host: www.baidu.com
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我们可以看到

CONNECT comet.zhihu.com:443 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

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

CONNECT字段将代理服务器转换为TCP隧道,然后HTTPS由端口替换协议:443

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


caf*_*caf 17

HTTP代理服务器的要求在其中指定

RFC7230 - 超文本传输​​协议(HTTP/1.1):消息语法和路由

  • 该 rfc 没有描述任何有关 https 代理的信息 (2认同)
  • @nikoss:这个答案引用的原始 RFC (RFC2616) 被分成多个 RFC。请参阅 [RFC7231 的第 4.3.6 节](https://tools.ietf.org/html/rfc7231#section-4.3.6) 了解“CONNECT”方法,该方法用于建立代理隧道,在该隧道上进行 TLS 会话可以建立 HTTPS 请求。 (2认同)

Mic*_*yan 7

代理与服务器非常相似; 唯一的区别是,在解析请求之后,它只是转发它并返回结果*,而不是处理请求本身.因为代理不需要像普通服务器那样进行相同数量的处理,所以它通常可以比完整服务器更少地解析请求,但是否则它是相同的想法.

*某些代理实现了额外的缓存.有些人还会回应/请求,但这是邪恶的代理,希望你没有想到.

  • 过滤代理通常用于维护个人隐私。它们还有助于去除不需要的内容,例如广告或跟踪 cookie,并且它们可以减小传输的大小。另一方面,可以使用简单的直通代理来跟踪和记录您的所有活动。 (2认同)