Proxy 负载平衡代理背后:如何知道哪一个I';我在用什么?

Proxy 负载平衡代理背后:如何知道哪一个I';我在用什么?,proxy,load-balancing,Proxy,Load Balancing,公司环境:在我和互联网之间,有一个负载平衡的代理。MSIE连接设置指向一个proxypac文件,该文件大致显示: function FindProxyForURL(url, host) { if ((shExpMatch(host,"intranet1.corp")) || (shExpMatch(host,"intranet2.corp"))) return "DIRECT"; else return "PROXY proxy1.corp:3128; PROXY proxy2.

公司环境:在我和互联网之间,有一个负载平衡的代理。MSIE连接设置指向一个
proxypac
文件,该文件大致显示:

function FindProxyForURL(url, host)
{
if ((shExpMatch(host,"intranet1.corp")) || (shExpMatch(host,"intranet2.corp")))
    return "DIRECT";
else
    return "PROXY proxy1.corp:3128; PROXY proxy2.corp:3128";
}

我的问题:从程序上讲,我如何确定我使用的代理?我在Windows上。

您的示例PAC文件配置为故障切换,而不是负载平衡。
换句话说,您的IE将始终首先尝试通过“proxy1.corp”进行连接,如果失败,它将尝试通过“proxy2.corp”进行连接。
请注意,IE使用“自动代理结果缓存”,如下所示:

理论上,每次调用FindProxyForURL()函数时 web浏览器即将获取对象。实际上,, 然而,微软的Internet Explorer拥有微软所称的 “自动代理结果缓存”。每当代理HTTP服务器(位于 使用调用FindProxy ForUrl()函数的结果,或 否则)将成功联系以获取对象APR缓存 已更新以包含该对。如果,什么时候 调用FindProxyForURL()函数,Internet Explorer将查找主机 已在APR缓存中列出,它使用列出的代理HTTP服务器 在APR缓存项中,而不是调用FindProxyForURL() 再次为同一主机运行。(APR缓存的目的是 尝试减少JavaScript函数的运行次数 ,从而减少获取对象的开销。)因为 Internet Explorer的APR缓存按主机名编制索引,这意味着 PAC脚本不可能可靠地生成多个不同的脚本 除主机名外,根据URL的任何部分生成结果。信息技术 例如,不可能提供不同的代理配置 根据单个主机上URL的路径部分。因为 Internet Explorer的APR缓存缓存代理HTTP服务器,而不是 FindProxyForURL()函数的完整结果,这意味着 中不会发生从一个代理HTTP服务器到另一个代理HTTP服务器的回退 即使FindProxyForURL()函数返回 几个代理HTTP服务器的列表。
总结这些问题,并描述如何关闭Internet Explorer的APR缓存。微软的Internet Explorer也可以缓存 有关“坏”代理HTTP服务器的信息,请持续30分钟。这没有问题 与PAC脚本直接相关,但它通常会引起混淆 当人们设置代理HTTP服务器并创建PAC时 脚本的同时,代理HTTP服务器出现问题, 将其作为“坏”缓存30分钟,会被误诊为 PAC脚本有问题

如果要使用PAC文件进行负载平衡,请查看一些示例。
但是,即使您在两个代理“proxy1”和“proxy2”之间进行了负载平衡,所使用的代理也可能会在每次请求时更改;此外,如果您在任何时候都有多个IE实例处于活动状态,则可能会出现某些实例使用“proxy1”而其他实例使用“proxy2”的情况。
因此,要回答您的问题,一个解决方案可能是检查HTTP头响应中的。 例如,考虑下面的HTML页面:

<!DOCTYPE html>
<html>
  <head>
    <title>Javascript Proxy Detection</title>
    <script language="javascript">
    function doRequest(url) {
      if (typeof XMLHttpRequest != 'undefined') {
        try {
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.open("GET", url, true);
          xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
              document.myForm.txt.value = xmlhttp.getAllResponseHeaders();
            }
          }
          xmlhttp.send(null);
        } catch (e) {
          alert(e.message);
        }
      } else {
        alert('no XMLHttpRequest');
      }
    }
    </script>
  </head>
  <body>
    <form name="myForm">
      <textarea cols="50" rows="10" name="txt"></textarea><br />
      <input type="button" value="Test Proxy" onclick="doRequest(location.href)">
    </form>
  </body>
</html>
通过代理请求相同的页面(在我的例子中是Squid),您还将获得“via”字段:

Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 470
Content-Type: text/html
X-Cache: MISS from ****
X-Cache-Lookup: HIT from ****:3128
Via: 1.1 ****:3128 (squid/2.7.STABLE9)
因此,通过检查标题中是否存在“via”字段,您应该能够确定:

  • 如果您使用的是代理
  • 使用的代理
  • 更多参考资料:


    您的示例PAC文件配置为故障切换,而不是负载平衡。
    换句话说,您的IE将始终首先尝试通过“proxy1.corp”进行连接,如果失败,它将尝试通过“proxy2.corp”进行连接。
    请注意,IE使用“自动代理结果缓存”,如下所示:

    理论上,每次调用FindProxyForURL()函数时 web浏览器即将获取对象。实际上,, 然而,微软的Internet Explorer拥有微软所称的 “自动代理结果缓存”。每当代理HTTP服务器(位于 使用调用FindProxy ForUrl()函数的结果,或 否则)将成功联系以获取对象APR缓存 已更新以包含该对。如果,什么时候 调用FindProxyForURL()函数,Internet Explorer将查找主机 已在APR缓存中列出,它使用列出的代理HTTP服务器 在APR缓存项中,而不是调用FindProxyForURL() 再次为同一主机运行。(APR缓存的目的是 尝试减少JavaScript函数的运行次数 ,从而减少获取对象的开销。)因为 Internet Explorer的APR缓存按主机名编制索引,这意味着 PAC脚本不可能可靠地生成多个不同的脚本 除主机名外,根据URL的任何部分生成结果。信息技术 例如,不可能提供不同的代理配置 根据单个主机上URL的路径部分。因为 Internet Explorer的APR缓存缓存代理HTTP服务器,而不是 FindProxyForURL()函数的完整结果,这意味着 中不会发生从一个代理HTTP服务器到另一个代理HTTP服务器的回退 即使FindProxyForURL()函数返回 几个代理HTTP服务器的列表。
    总结这些问题,并描述如何关闭Internet Explorer的APR缓存。微软的Internet Explorer也可以缓存 有关“坏”代理HTTP服务器的信息,请持续30分钟。这没有问题 与PAC脚本直接相关,但它通常会引起混淆 当人们设置代理HTTP服务器并创建PAC时 脚本的同时,代理HTTP服务器出现问题,
    Accept-Ranges: bytes
    Vary: Accept-Encoding
    Content-Encoding: gzip
    Content-Length: 470
    Content-Type: text/html
    X-Cache: MISS from ****
    X-Cache-Lookup: HIT from ****:3128
    Via: 1.1 ****:3128 (squid/2.7.STABLE9)