问题:
什么是代理Pac文件?是否有任何示例?
环境: 思科网络安全设备
注意:此知识库文章中提及了思科不维护或支持的软件。 提供该信息只是为了方便您使用。如需进一步协助,请联系软件供应商。
参考链接:JavaScript或JScript自动代理示例文件
JavaScript或JScript自动代理示例文件
下面的脚本作为示例,展示了如何使用“.pac”文件指定自动代理 URL。要使用此功能,您必须先更改代理名称、端口编号和 IP 地址。
- isInNet、isResolvable和dnsResolve函数查询DNS服务器
- 对对象模型对象、属性或方法的引用会导致代理自动配置文件以静默方式失败。例如,参考window.open(...)、alert(...)和password(...)都会导致代理自动配置文件在Internet Explorer上失败。
示例1:本地主机直接连接,所有其他主机通过代理连接
以下函数检查主机名是否为本地主机,如果是,检查连接是否直接。如果主机名不是本地主机,则通过代理(代理)进行连接。
函数FindProxyForURL(url, host)
{
if (isPlainHostName(host))
返回“直接”;
其他
返回"PROXY proxy:80";
}
isPlainHostName函数检查主机名中是否存在任何点。如果是,则返回false;否则,函数返回true。
注意:对于与本地Web服务器的直接连接,可能还需要匹配域或子网。并非所有对本地Web服务器的请求都仅使用主机名完成
示例2:防火墙内的主机直接连接,外部本地服务器通过代理连接
以下函数检查主机名是“普通”主机名(意味着不包括域名)还是特定域(.company.com)的一部分,但主机名不是www或home。
函数FindProxyForURL(url, host)
{
if ((isPlainHostName(host)) ||
dnsDomainIs(主机,“.company.com”))&&
!localHostOrDomainIs(host, "www.company.com") &&
!localHostOrDomainIs(host, "home.company.com"))
返回“直接”;
其他
返回"PROXY proxy:80";
}
注意:
- localHostOrDomainIs函数仅对本地域中的URL执行。
- 如果主机名的域与给定的域匹配,dnsDomainIs函数将返回true。
示例3:如果主机可解析,请直接连接。否则,使用代理进行连接。
以下函数要求DNS服务器尝试解析向其传递的主机名。如果可以,则建立直接连接。如果不能,则通过代理建立连接。当使用内部DNS服务器解析所有内部主机名时,此功能非常有用。
函数FindProxyForURL(url, host)
{
if (isResolvable(host))
返回“直接”;
其他
返回"PROXY proxy:80";
}
请参阅页面顶部的isResolvable函数注释。
示例4:如果主机在指定子网中,请直接连接。否则,使用代理进行连接。
以下函数将给定的IP地址模式和掩码与主机名进行比较。如果子网中的某些主机应直接连接,而其它主机应使用代理连接,则此命令非常有用。
函数FindProxyForURL(url, host)
{
if (isInNet(host, "999.99.9.9", "255.0.255.0"))
返回“直接”;
其他
返回"PROXY proxy:80";
}
请参见页顶部的isInNet函数注释。
如果主机IP地址与指定的模式匹配,isInNet(host, pattern, mask)函数将返回true。掩码指示要匹配的IP地址部分(255=match, 0=ignore)。
示例5:根据主机域确定连接类型
如果主机是本地主机,则以下函数指定直接连接。如果主机不是本地主机,此功能将根据主机域确定使用哪个代理。如果主机域名是选择代理的条件之一,则此命令很有用。
函数FindProxyForURL(url, host)
{
if (isPlainHostName(host))
返回“直接”;
else if (shExpMatch(host, "*.com"))
返回"PROXY comproxy:80";
else if (shExpMatch(host, "*.edu"))
返回"PROXY eduproxy:80";
其他
返回“代理代理";
}
如果str使用shell表达式模式与shexp匹配,shExpMatch(str, shexp)函数将返回true。
示例6:根据使用的协议确定连接类型
以下函数提取正在使用的协议,并相应地选择代理。如果未在协议上进行匹配,则建立直接连接。如果使用的协议是代理选择的标准之一,则此命令很有用。
函数FindProxyForURL(url, host)
{
if (url.substring(0, 5) == "http:") {
返回"PROXY proxy:80";
}
else if (url.substring(0, 4) == "ftp:") {
返回"PROXY fproxy:80";
}
else if (url.substring(0, 7) == "gopher:") {
返回"PROXY gproxy";
}
else if (url.substring(0, 6) == "https:") {
返回"PROXY secproxy:8080";
}
其他{
返回“直接”;
}
}
子字符串函数从字符串中提取指定数量的字符。
示例7:通过检查主机名是否与IP地址匹配来确定代理设置
以下函数通过将主机名转换为IP地址并将其与指定字符串进行比较来选择代理。
函数FindProxyForURL(url, host)
{
if (dnsResolve(host) == "999.99.99.999") { // = http://proxy
返回"PROXY secproxy:8080";
}
其他{
返回"PROXY proxy:80";
}
}
请参阅页面顶部有关dnsResolve功能的说明。
示例8:如果主机IP与指定的IP匹配,请通过代理连接,否则请直接连接
以下功能是基于指定IP地址进行代理选择的另一种方法。与示例7不同,此示例使用函数调用显式获取数字IP地址(示例7使用dnsResolve函数将主机名转换为数字IP地址)。
函数FindProxyForURL(url, host)
{
if (myIpAddress() == "999.99.999.99") {
返回"PROXY proxy:80";
}
其他{
返回“直接”;
}
}
myIpAddress函数返回运行浏览器的主机的IP地址(采用整数点格式)。
示例9:如果主机名中有任何点,请使用代理连接。否则,请直接连接。
以下函数检查主机名中的点数。如果主机名中有任何点,请通过代理建立连接。如果主机名中没有圆点,请建立直接连接。这是根据主机名特征确定连接类型的另一种方法。
函数FindProxyForURL(url, host)
{
如果(dnsDomainLevels(host) > 0) { // if the number of dots in host > 0
返回"PROXY proxy:80";
}
返回“直接”;
}
dnsDomainLevels函数返回一个整数,等于主机名中的点数。
示例10:指定星期几通过代理连接,其他天直接连接
以下函数通过指定适用于代理的一周中的天数来确定连接类型。不介于这些参数之间的天数使用直接连接。在流量较大时您可能想要使用代理,而在流量较小时允许直接连接的情况下,此功能非常有用。
函数FindProxyForURL(url, host)
{
if(weekdayRange(“星期三”、“星期六”、“GMT”))
返回"PROXY proxy:80";
其他
返回“直接”;
}
weekdayRange(day1 [,day2] [,GMT])函数返回当前系统时间是否在参数day1、day2和GMT指定的范围内。只需要第一个参数。GMT参数假定时间值为格林威治标准时间,而不是本地时区。
示例11:使用简单数学函数执行负载均衡
函数FindProxyForURL(url, host){
return randomProxy();
}
function randomProxy()
{
switch( Math.floor( Math.random() *2))
{
案例0:返回“PROXY 1.1.1.1:3128; PROXY 2.2.2.2; PROXY DIRECT;”
案例1:返回“PROXY 2.2.2.2:3128; PROXY 1.1.1.1; PROXY DIRECT;”
}
}
您将看到,在一个代理不可用时,这些情况还实施故障切换。