我最近参加了一个关于当客户端从代理服务器请求页面时会发生什么的讨论。 我只想确保在一般情况下,我对这一系列事件的理解是正确的:
任何反馈将不胜感激。
不完全是:这取决于如何configuration客户端。 我们以IE为例子。
如果您使用显式代理configurationIE:例如,没有其他选项打勾,代理设置为:8080。
用户input地址
IE检查地址是否与IE代理例外列表 (即“这些地址的旁路代理:”)进行string匹配
一个。 如果它与Bypass列表中的条目匹配 ,则客户端使用自己的DNSparsing名称,然后客户端直接连接到端口80上的目标IP地址 (假定),然后发送如下请求:
GET /something.htm HTTP/1.1
Host: fulldomainame.example.com
这是匹配条目的结尾 。
C。 如果没有旁路列表条目匹配 ,请继续:
IE连接到其configuration的代理 ,并发送一个表单的请求:
GET http://fulldomainname.example.com/something.htm HTTP/1.1
(顺便说一句:这个使用FQDN作为URL是一种方式,你可以告诉客户端认为它是与代理服务器而不是真正的Web服务器)
代理使用自己的DNS parsing主机名 ,连接到目标站点等
使用WPAD / PAC时:
在使用WPAD或自动configuration脚本(例如在启用自动configuration时由ISA / TMG提供)的情况下,它是不同的:
用户input地址
客户端从其configuration的位置下载当前的wpad.dat / autoproxy.js / .pac文件
客户端在js文件中查找入口点“ FindProxyForUrl ”,并执行它
Autoproxy脚本处理主机名和URL 。 这是一个function有限的JavaScript文件,但很多东西仍然有可能:
一个。 这可能包括名称parsing (IsInNet,DnsResolve)
湾 这可能包括string匹配 (ShExpMatch)
C。 这可能包括数百万 (i ++)
d。 这可能包括narky警报popup消息,如果pipe理员是一个混蛋(或只是有趣的(或debugging))
FindProxyForUrl函数返回至less一个string :使用的最佳代理的有序列表(以分号分隔)
一个。 要么是“直接” ,在这种情况下,客户端需要自己parsing名称并直接连接,如上面的绕过案例
湾 或“PROXY proxyname:8080”或类似的,在这种情况下,客户端连接到该代理上的端口,告诉它获取完整的URL ,并且代理执行名称parsing 。
偶尔会出现小故障,微妙和不明原因的行为,但大多数情况下,当事情不是以怪异和有趣的方式打破时,以上是我多年来看到的。 较新的浏览器正在优化行为,并行化,并尝试有趣的东西,所以检查给定浏览器的最新文档,以了解细节。
WinSock代理/ ISA防火墙客户端/ TMG客户端 :
如果您对Winsock代理客户端(来自TMG / ISA Server)感兴趣,那么这是一个不同的故事,具有更多的灵活性和移动部分。 进入这里太多了,但是有些文档描述了它是如何工作的。 简而言之:它插入Windows套接字,并可以拦截基于TCP / UDP的stream量和名称parsing请求在每个应用程序和每个用户的基础上。 非常强大,但现在也不推荐使用,并且在几年内还没有更新。
客户可以是真正紧贴:
最后一个注意事项 :一旦HTTP客户端决定与给定站点/ URL 的代理进行通信,代理就无法告诉它不要 。
没有HTTP状态代码或标题为“我不服务,你应该直接去它”,而不是…
一旦客户端决定一个特定的URL被代理服务,随之而来的是代理死锁。
避免这种情况的唯一方法是在客户端进行连接之前,在PAC或Bypass列表中获取select逻辑。
我不确定你的DNS部分是否正确。 我看到一台机器没有有效的DNS服务器在IE中使用代理获取页面。
我尝试在Ubuntu 10.04,酒,IE 6.0和鱿鱼2.7(系统有一个DNS和鱿鱼有其他DNS服务器)
IE 6.0不能parsingDNS名称。
我不认为这是 – 如果您在例外列表或域中键入IP和域名,并且IP位于例外列表中,则可能仍然通过代理服务器。
proxy.pac / wpad.dat可能会使你强迫你摆脱这种行为。