企业环境:在我和互联网之间,有一个负载均衡的代理。 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上。
答案 0 :(得分:3)
您的示例PAC文件配置为进行故障转移,而不是负载平衡
换句话说,您的IE将始终首先尝试通过“proxy1.corp”连接,然后如果失败,它将尝试通过“proxy2.corp”连接。
请注意,IE使用“自动代理结果缓存”,因为您可以阅读here:
理论上,每次调用FindProxyForURL()函数 Web浏览器即将获取一个对象。在实践中, 但是,微软的Internet Explorer具有微软所说的内容 “自动代理结果缓存”。每当代理HTTP服务器(位于 使用对FindProxyForURL()函数的调用结果或 成功联系以获取对象APR缓存 已更新为包含该对。如果,即将到来 调用FindProxyForURL()函数,Internet Explorer找到主机 已经列在APR缓存中,它使用列出的代理HTTP服务器 在APR缓存条目中而不是调用FindProxyForURL() 再次为同一主机运行。 (APR缓存的目的是 尝试减少JavaScript函数的次数 要运行,从而减少获取对象的开销。)因为 Internet Explorer的APR缓存由主机名索引,这意味着 PAC脚本不可能可靠地产生多个不同的 除主机名外,还会根据URL的任何部分生成结果。它 例如,提供不同的代理配置是不可能的 根据单个主机上URL的路径部分。因为 Internet Explorer的APR缓存缓存代理HTTP服务器而不是缓存 FindProxyForURL()函数的完整结果,这意味着 从一个代理HTTP服务器回退到另一个不会发生 即使FindProxyForURL()函数返回了一个问题的事件 多个代理HTTP服务器的列表。Microsoft's KnowledgeBase article #271361 总结了这些问题,并介绍了如何关闭Internet Explorer的APR缓存。微软的Internet Explorer也可以缓存 有关“坏”代理HTTP服务器的信息,持续30分钟。这没有 直接影响PAC脚本,但它经常引起混淆 当人们设置代理HTTP服务器并创建PAC时 脚本同时出现,代理HTTP服务器出现问题, 导致它被缓存为“坏”30分钟,被误诊为 PAC脚本的问题。
如果要使用PAC文件进行负载平衡,请查看this page以获取一些示例
但是,即使您在两个代理“proxy1”和“proxy2”之间进行负载平衡,所使用的代理也可能在每个请求时发生更改;此外,如果您在任何时候有多个IE实例处于活动状态,您可能会遇到某些实例正在使用“proxy1”而其他实例正在使用“proxy2”的情况。
因此,要回答您的问题,一种解决方案可能是检查HTTP标头响应中的"via" field。
例如,请考虑以下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>
通过直接连接(无代理)请求此页面,然后单击“测试代理”按钮,您将获得此类输出:
Content-Encoding: gzip
Content-Length: 470
Server: Apache/2.2.17 (Ubuntu)
Vary: Accept-Encoding
Content-Type: text/html
Accept-Ranges: bytes
通过代理请求同一页面(在我的案例中为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”字段的存在,您应该能够确定:
进一步参考: