跳到主要内容

PAC (Proxy auto-config) 语法

信息

如果文档有错误或者您有建议,请在Mudfish论坛(https://forums.mudfish.net)留言。这里提到的示例和解释是通过翻译或参考以下网站的内容而编写的。

对于 Mudfish 浏览器扩展,它支持 PAC (Proxy auto-config) 文件格式。

PAC 函数​

支持PAC格式的浏览器通常支持以Netscape指定的标准格式呈现的功能。

然而,这些功能通常在 sandbox 内运行,因此运行在严格限制的环境中。比如查看User Agent信息就完全被屏蔽了。

以下介绍沙箱环境中允许使用的函数。

dnsDomainIs​

检查 Hostname,如果匹配,则返回 true。通常用于检查特殊个体hostname。

   // 如果主机名为 google.com 或匹配其子域名
//(如 maps.google.com、www.google.com),浏览器直接连接,不经过代理。

if (dnsDomainIs(host, "google.com"))
return "DIRECT";

shExpMatch​

将 Hostname 或 URL 与 shell 表达式指定的字符串进行比较,如果匹配,则返回 true。

   // 让匹配 *.local 的请求直接连接,不经过代理。

if (shExpMatch(url, "*.local"))
return "DIRECT";

// 访问 vpn.domain.com 或 http://abcdomain.com/folder/ 下
// 任意文件和目录的请求直接连接,不经过代理。

if (shExpMatch(host, "vpn.domain.com") ||
shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";

isInNet​

此函数检查 hostname 的 IP 地址是否位于指定子网中;如果是,则返回 true。若传入的是主机名,会先通过 DNS 解析将其转换为 IP 地址。

   // 如果主机名经 DNS 解析后的 IP 地址位于指定网段,则直接连接。

if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";

myIpAddress​

返回我当前计算机的 IP 地址。

   // 如果本机地址位于指定网段,则通过代理 10.10.5.1:8080 发送请求。

if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
return "PROXY 10.10.5.1:8080";

dnsResolve​

通过 DNS 解析将主机名转换为 IP 地址。

   // 如果请求的主机 IP 地址位于指定网段,则直接连接。

if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
return "DIRECT";

isPlainHostName​

如果主机名不含任何点号(.),则返回 true。例如,它指的是类似http://intranet的东西,通常可以在访问内网网址时使用。

   // 如果请求的是不带点号的主机名(如 http://intranet/ 或
// http://webserver-name01/),则直接连接。

if (isPlainHostName(host))
return "DIRECT";

localHostOrDomainIs​

检查 Hostname,如果 hostname 部分匹配,则返回 true。

   // 如果请求的主机名为 www 或 www.google.com,则直接连接。

if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";

isResolvable​

Hostname 转换为 IP 地址,如果成功,则返回 true。

如果域名无法正确解析,浏览器可能会短暂卡住。请谨慎使用此功能。

   // 如果 DNS 服务器能解析该主机名,则通过 proxy1.example.com 代理连接。

if (isResolvable(host))
return "PROXY proxy1.example.com:8080";

dnsDomainLevels​

检查主机名并返回其中点号(.)的数量。例如,它可用于指定内部网络 Web 服务器作为例外。

   // 如果主机名至少包含一个点号,则通过 proxy1.example.com 代理连接,
// 否则直接连接。

if (dnsDomainLevels(host) > 0)
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

weekdayRange​

根据时间创建rule时可以使用。例如,当您只想在特定日期返回 proxy 设置时,可以使用它。

   // 周一到周五使用 proxy1.example.com 代理,否则直接连接。

if (weekdayRange("MON", "FRI"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

dateRange​

根据时间创建rule时可以使用。例如,当您只想将 proxy 应用到特定月份时,可以使用它。


// 一月到三月使用 proxy1.example.com 代理,否则直接连接。

if (dateRange("JAN", "MAR"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

timeRange​

当您只想在特定时间使用 proxy 时,可以使用此功能。

   // 仅在上午 8 点到下午 6 点使用 proxy1.example.com,否则直接连接。

if (timeRange(8, 18))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

alert​

首次定义 PAC 格式时不存在此函数,但它是在 Internet Explorer 和 Firefox 浏览器中为故障排查定义的函数。

   // 在浏览器的错误控制台输出 DNS 解析结果。

resolved_host = dnsResolve(host);
alert(resolved_host);