Intro

代理自动配置(PAC)文件是一个 JavaScript 脚本,其核心是一个 JavaScript 函数,用来决定网页浏览请求(HTTP、HTTPS,和 FTP)应当直连目标地址,还是被转发给一个网页代理服务器并通过代理连接。

函数

PAC文件中必须包含一个函数

1
2
3
function FindProxyForURL(url, host){

}

参数url是用户输入的url,参数host是url中的主机名。

一个最简单的PAC文件内容如下:

1
2
3
function FindProxyForURL(url, host) {
return "DIRECT";
}

这个PAC文件实际上什么也没做,对任何URL,都将”DIRECT”(直接连网)。

参数

url

要访问的 URL。URL 中类似 https:// 这样的的路径和查询组件已被去除。在 Chrome 浏览器(版本 52 至 73)中,你可以通过设置 PacHttpsUrlStrippingEnabledfalse 来禁止这种行为,或者以 --unsafe-pac-url 命令行参数启动(自 Chrome 74 起,仅命令行参数有效,且在 Chrome 75 及之后的版本中无法禁用这种行为;至于 Chrome 81,路径剥离对 HTTP URL 不适用,但有意改变这一行为以适应 HTTPS);在 Firefox 浏览器中,对应的选项是 network.proxy.autoconfig_url.include_path

host

从 URL 中提取得到的主机名。这只是为了方便;它与 :// 之后到第一个 :/ 之前的字符串相同。端口号不包括在此参数中,必要时可以自行从 URL 中提取。

返回值

返回值格式

  • FindProxyForURL() 函数返回一个字符串
  • 如果那个字符串为空,则不使用任何代理
  • 字符串中可以包含如下任意数量的“代理配置块”(building blocks),用分号分隔:

如果返回值是一个代理

  • DIRECT
  • PROXY host:port
  • SOCK5 host:port

返回一个指定的代理

1
2
3
function FindProxyForURL(url, host) {
return "PROXY 192.168.1.1:3128";
}

返回http代理,并指定代理服务器和端口。

返回多个代理

1
2
3
function FindProxyForURL(url, host) {
return "DIRECT; PROXY 192.168.1.1:3128; SOCKS5 lilinux.net:1080";
}

返回值表示的含义:

  1. 对所有URL,都直接连接;
  2. 如果不能直接连接,那么就使用192.168.1.1:3128这个http代理连接;
  3. 如果还是不能连接,则使用lilinux.net:1080这个socks5代理连接。

使用不同连接的顺序和语句中的顺序一致,你可以根据自己的实际情况更改。

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var Proxy = "PROXY 127.0.0.1:10808; SOCKS 127.0.0.1:10809; DIRECT;";

var domains = [
"github.com",
"jhsy0330.github.io",
];

function FindProxyForURL(url, host) {
for (var i = domains.length - 1; i >= 0; i--) {
if (dnsDomainIs(host, domains[i])) {
return Proxy;
}
}
return "DIRECT";
}

这有一个简单的PAC文件参考。

如果host在domain数组里,就执行代理操作否则直连

注意语法错误 如果PAC文件语法出现错误,无法返回代理

其他函数

PAC文件中还可以调用JavaScript其他函数

具体参考https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file#weekdayrange

GFWLIST.PAC

Github:https://github.com/petronny/gfwlist2pac

Automatically convert gfwlist to pac everyday

Just use https://raw.githubusercontent.com/petronny/gfwlist2pac/master/gfwlist.pac

Proxys / CDNs: