HTTP代理协议 HTTP/1.1的CONNECT方法

我们平时使用HTTP协议无非就是GET、POST这些方法,但是HTTP的内容远不止那些。今天就来说说HTTP代理使用的CONNECT。这个不是在网页开发上用的,如果没兴趣就跳过吧。

  APACHE只是作为网页的服务器被使用的,不会支持这个方法。如果要使用它必须在服务器上安装相应的软件。这样的软件很多,百度一下HTTP代理服务器就可以找到一大把。
CONNECT这个方法的作用就是把服务器作为跳 板,让服务器代替用户去访问其它网页,之后把数据原原本本的返回给用户。这样用户就可以访问到一些只有服务器上才能访问到的网站了,这就是HTTP代理。 说到代理,我想各位在党的旗帜下成长的同学都不会陌生吧。我们使用的网络被称为天朝局域网,它离Internet还有很长的一段路要走。所以,我们就必须 越过重重坎坷去摸一摸这个世界本来的样子。哎呀,不小心又扯了一下蛋。下面来说说这个CONNECT方法的用法。
CONNECT方法是需要使用TCP直接去连接 的,所以不适合在网页开发中使用,不过网页开发中也用不到这玩意儿。要是使用CONNECT方法,首先要让服务器监听一个端口来接收CONNECT方法的 请求。这个是服务器软件做的事情,我们只要配置好它就可以了,除非你闲着无聊想自己实现一个这样的服务器。在服务器监听了端口以后就是客户端的请求,我们 必须告诉代理服务器我们想要访问哪个Internet服务器。假如我想通过代理访问这个博客(www.web-tinker.com),我就需要建立一个 TCP连接,连接到服务器监听的那个端口,然后给服务器发送一个HTTP头。下面就是这个HTTP头的内容:CONNECT www.web-tinker.com:80 HTTP/1.1
Host: www.web-tinker.com:80
Proxy-Connection: Keep-Alive
Proxy-Authorization: Basic *
Content-Length: 0

   所有的HTTP头都是类似的,第一行是方法名、主要参数、HTTP版本。接着一行一个参数,最后用两个换行来结束。这个HTTP头其实也没什么好介绍 的,唯一一个重点的地方就是星号的部分,这个地方应该填写验证的用户名和密码。而且,用户名和密码也是有固定格式的。要把用户名和密码用冒号连接起来,再 经过BASE64的编码后才可以使用。假如用户名是abc密码是123,那么星号的地方就应该换上YWJjOjEyMw==,也就是abc:123经过 BASE64编码的结果。
发送完这个请求之后,就是服务器端响应请求了。如果用户名和密码验证通过,就会返回一个状态码为200的响应信息。虽然状态码是200,但是这个状态描述不是OK,而是Connection Established。HTTP/1.1 200 Connection Established

  如果用户名和密码验证不通过。会返回一个407的状态码,状态表述是Unauthorized。表示没有权限访问代理服务器。HTTP/1.1 407 Unauthorized

   验证失败的情况有时候还会带上一堆HTML,这是有些服务器为了让网页上在连接失败是显示用的,如果不是通过浏览器来连接的话无视就好了。无论验证成功 还是验证失败,这些服务器返回的信息在不同的服务器软件上会有一些差异。比如有些服务器软件返回这些代码会使用HTTP/1.0,有些则会在后面加上个代 表服务器版本的字段。这些信息都无所谓,对于服务器返回的数据,我们关键是看状态码。
验证通过之后,我们就可以做普通的HTTP操作 了。完全可以把现在的代理服务器看作是请求连接的Internet服务器,也就是说可以像直接访问普通的服务器一样,使用GET、POST等方法来请求 Internet服务器上的页面了。我们在发送CONNECT请求的时候就已经告诉了服务器我们需要访问的Internet服务器,上面我用了这个博客的 网址。现在我们要访问这个博客的主页就可以发送一个简单的GET请求。GET / HTTP/1.1
Host: www.web-tinker.com
Content-Length: 0

   这个就是普通的GET请求的操作了,我就不多说了,这样CONNECT方法的操作就完成了。假如哪天这个博客被墙了,就可以通过这个方式来访问。但是道 高一尺魔高一丈,天朝的和谐技术已经不仅仅在与IP屏蔽上了。如果使用HTTP代理访问youtube这种超级和谐的网站就会被拦截下来,毕竟HTTP是 明文传输的,不仅是域名,只要网站中有和谐字眼的都会被拦截。所以,这个HTTP代理只能访问一些被屏蔽了IP,但是没有被和谐的太严重的网站。如果需要 逃过天朝的网络监视就必须使用加密的连接方式,比如SOCK5代理或者加密的VPN。总之,注意和谐吧。

HTTP GET/CONNECT代理区别举例:

HTTP Proxy Server :  127.0.0.1 8080
Access Web Site: www.example.com/index.php

1) 无代理:
GET /index.PHP HTTP/1.1
HOST: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: xxxxxx
Cookie: xxxxxx
Cache-Control: max-age=0

2) HTTP GET 代理(HTTP1.0/HTTP1.1都支持) - socket首先与127.0.0.1:8080建立连接
GET http:/www.example.com/index.php HTTP/1.1
HOST: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Referer: xxxxxx
Cookie: xxxxxx
Cache-Control: max-age=0

3) HTTP CONNECT代理(只有HTTP1.1支持) - socket首先与127.0.0.1:8080建立连接
CONNECT http:/www.example.com/index.php HTTP/1.1
HOST: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Referer: xxxxxx
Cookie: xxxxxx
Cache-Control: max-age=0

注:HTTP CONNECT是在HTTP1.1协议上才新增的命令,用于支撑https加密。
所以,许多支持http connect的http proxy,比如squid,默认都限制只允许访问外部的443端口,其它端口不提供代理服务。

发表评论