最近对接第三方平台时遇到了浏览器上Ajax发出复杂请求先发出options请求“嗅探”服务器端资源时,由于第三方平台服务器并做跨域的操作,也不可能为我们修改跨域,导致了网页请求受到浏览器同源策略的限制。因此采用服务器代理的方式访问第三方平台,再返回至浏览器。百度了一下,看了几篇前辈写的博客,粗略的了解了一下服务器代理的逻辑,下面记录下个人的理解。
正向代理。大多数博客都写了正向代理隐藏了客户端信息,所有请求都到代理服务器上,由代理服务器发至真正要访问的服务器。此时服务器不知道请求的真正来源,因为服务器收到的请求都是代理服务器发出的。举个例子,《绝命毒师》里瘾君子要买冰毒,他们不直接找老白和pussy(生产冰毒的人),他们先去找站街的马仔,站街马仔的冰毒是从老白和pussy那里拿到的,再将冰毒卖给瘾君子。其中老白和pussy就是服务器资源,马仔是代理服务器,瘾君子是客户端。很明显的一点是,如果客户端直接去服务器拿资源,会受到限制,即浏览器的同源策略(因为贩毒集团不会允许瘾君子去买,这样的风险比较大,一旦被捕,会损失一个日产很高的冰毒生产实验室(重建需要数月的准备,制毒人才的寻觅),如果马仔被捕的话,实验室可以继续生产,马仔可以迅速替换,相比之下,两者孰轻孰重显而易见)。贩毒例子和真实服务器情况不同的一点是,真实代理服务器是接到客户端请求后去服务器拿资源的。而举例贩毒的是代理先在服务器拿到资源,然后等待客户端请求的。但是不管是代理服务器先拿资源还是后拿资源,最重要的一点是客户端都感知不到服务器端的存在,提供了一种安全的方式。这种方式被称为“正向代理”。(谁命名的,根据什么逻辑,什么技术树,有什么前置技术命名的我也没深入了解)。
反向代理。同样隐藏了客户端信息,相较于“正向代理”,反向代理也隐藏的服务器端信息(分布式的情况下不知道哪个服务器处理了请求)。关于正和反,对于我们来说感觉有种从代理的技术上的顺序的概念,但是我个人比较认同一个博客说的 ,这里的正反只是区分两种不同的方式,先是正向代理,后来产生的不同于正向代理的代理方式,命名为反向代理。关于正向代理和反向代理,我个人从逻辑上认为都隐藏了服务器的信息,即使服务器是单机的,从实现技术上不了解,需要再深入。
正向代理偏向于隐藏客户端,而反向代理相较于正向代理更偏向于服务器端。