PAC (Proxy auto-config) 语法
如果文档有错误或者您有建议,请在Mudfish论坛(https://forums.mudfish.net)留言。这里提到的示例和解释是通过翻译或参考以下网站的内容而编写的。
对于 Mudfish 浏览器扩展,它支持 PAC (Proxy auto-config) 文件格式。
PAC功能
支持PAC 格式的浏览器通常支持以Netscape指定的标准格式呈现的功能。
然而,这些功能通常在 sandbox 内运行,因此运行在严格限制的环境中。比如查看User Agent信息就完全被屏蔽了。
以下是 sandbox 环境中允许的功能的描述。
dnsDomainIs
检查 Hostname,如果匹配,则返回 true。通常用于检查特殊个体hostname。
// 만약 hostname 이 google.com 과 같거나 하위 주소들이 매치된다면
// (예를 들어 maps.google.com, www.google.com),
// 브라우저로 하여금 proxy 을 거치지 않고 직접 접속하게 합니다.
if (dnsDomainIs(host, "google.com"))
return "DIRECT";
shExpMatch
将 Hostname 或 URL 与 shell 表达式指定的字符串进行比较,如果匹配,则返回 true。
// 모든 request 들 (.local 로 끝나는 모든 hostname 에 해당) 이
// 브라우저로 하여금 proxy 을 거치지 않고 직접 접속하게 합니다.
if (shExpMatch(url, "*.local"))
return "DIRECT";
// vpn.domain.com 에 접속할려고 하거나
// http://abcdomain.com/folder/ 하위의 모든 폴더 혹은 파일에 접속하는
// 요청들을 proxy 경유없이 직접 접속합니다.
if (shExpMatch(host, "vpn.domain.com") ||
shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";
isInNet
此函数检查 hostname 的 IP 地址是否位于指定子网中;如果是,则返回 true。若传入的是主机名,会先通过 DNS 解析将其转换为 IP 地址。
// 만약 요청한 hostname 의 IP 주소가 (DNS resolving 후) 인자로 넘겨진
// IP 대역에 포함되는 것이면 직접 접속합니다.
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";
myIpAddress
返回我当前计算机的 IP 地址。
// 만약 나의 컴퓨터가 특정 IP 대역에 속할 경우 proxy 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 resolving将hostname转换为IP 地址。
// 만약 요청한 host 의 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
如果 hostname 没有 . (dot) 如果不包含任何字符,则返回 true。例如,它指的是类似http://intranet的东西,通常可以在访问内网网址时使用。
// 만약 사용자가 plain hostname (예를 들면, http://intranet/ 혹은
// http://webserver-name01/) 를 요청할 경우, 직접 접속하도록 합니다.
if (isPlainHostName(host))
return "DIRECT";
localHostOrDomainIs
检查 Hostname,如果 hostname 部分匹配,则返回 true。
// 만약 요청한 hostname 이 "www" 혹은 "www.google.com" 일 경우, 직접
// 접속합니다.
if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";
isResolvable
Hostname 转换为 IP 地址,如果 成功,则返回 true。
如果域名无法正确解析,浏览器可能会短暂卡住。请谨慎使用此功能。
// 만약 요청한 hostname 이 DNS 서버로 부터 resolving 이 될 수 있다면,
// proxy1.example.com 프록시를 통해 요청합니다.
if (isResolvable(host))
return "PROXY proxy1.example.com:8080";
dnsDomainLevels
检查 Hostname 并查看有多少个。返回(dot)是否存在。例如,它可用于指定内部网络 Web 服务器作为例外。
// 만약 hostname 이 . (dot) 을 하나라도 포함하고 있으면 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 应用到特定月份时,可以使用它。
// 만약 1월부터 3월까지는 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 浏览器中为 troubleshooting 定义的函数。
// 브라우저의 error 콘솔창에 DNS resolving 한 결과를 출력하도록 합니다.
resolved_host = dnsResolve(host);
alert(resolved_host);