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);