接进浏览器 · 10 月 24 日写 · 10 月 24 日改
PAC:自动代理配置脚本,怎么来、怎么写、填在哪
一行摘要PAC 不是代理,是一张写成脚本的判断表:浏览器拿着网址问它,它答「走 127.0.0.1 加某个端口」或者「直连」。端口后面要有本机客户端在跑。客户端生成的 PAC 地址直接填,自己写的只要一个函数、十行以内;填的位置决定它管全机还是只管一个浏览器。
PAC 是什么
PAC 的全称是代理自动配置,本质是一个 JavaScript 文件,里面只需要一个函数:
function FindProxyForURL(url, host) { ... }
浏览器每发一个请求,就把网址和主机名交给这个函数,函数返回一个字符串:"PROXY 127.0.0.1:7890" 表示交给这个地址和端口,"DIRECT" 表示直连。就这么多。
它和系统代理页里手动填的那一格相比,差别只有一个:手动那格是「全走」,PAC 是「按网址判断走不走」。它自己不连网,不提供线路,返回的那个端口后面得有本机客户端在跑,否则就是一个空口。
客户端生成的 PAC 地址
不少本机客户端有一个「PAC 模式」,或者在设置页里给出一条本机地址,形如 http://127.0.0.1:端口/pac 这类,具体几号、路径叫什么,以客户端自己的设置页为准,别照别处抄。
它生成的脚本一般是两部分:一张域名清单(常见的是按公开的清单生成),加一句「清单里的交给它自己的端口,其余直连」。你不用看内容,把地址填进后面说的位置就行。
客户端换了端口、换了模式,这个地址可能跟着变;填好之后客户端那边再改设置,记得回来对一遍。
自己写一个十行以内的 PAC
只想让几个域名走端口、其余全部直连,自己写比用清单更干净:
function FindProxyForURL(url, host) {
if (dnsDomainIs(host, ".example.com") ||
shExpMatch(host, "*.example.org")) {
return "PROXY 127.0.0.1:7890; DIRECT";
}
return "DIRECT";
}
逐行说:
dnsDomainIs(host, ".example.com"):主机名以这个后缀结尾就命中,example.com 本身和它下面的全部子域名一起算。shExpMatch(host, "*.example.org"):通配符写法,*匹配任意字符。两种写法挑顺手的,一行加一个域名。"PROXY 127.0.0.1:7890; DIRECT":先试代理,连不上就直连。要走 SOCKS 端口写成"SOCKS5 127.0.0.1:7891"。端口按客户端设置页上的数字填,本机端口那条词条讲了常见的几个。- 最后一个
return "DIRECT"是兜底:清单外的全部直连。
存成 proxy.pac,编码用 UTF-8,别用 Word 一类会加格式的软件编辑。改了之后,浏览器要重新加载才会读到新内容,后面每个位置各有刷新办法。
浏览器和系统各在哪填
| 位置 | 入口 | 管谁 |
|---|---|---|
| Windows 11 | 设置 → 网络和 Internet → 代理 → 「使用设置脚本」→ 设置 → 填「脚本地址」 | 所有读系统代理的软件 |
| macOS 14 及之后 | 系统设置 → 网络 → 正在用的网络 → 详细信息 → 代理 → 「自动代理配置」→ 填 URL | 同上,按网络服务各存一份 |
| Chrome / Edge | 没有自己的入口,跟系统;或者启动参数 --proxy-pac-url= |
跟系统时全机,带参数时只管那一份 |
| Firefox | 设置 → 常规 → 网络设置 → 「自动代理配置的 URL」 | 只有 Firefox |
| 切换器 | 新建「PAC 情景模式」,填地址或直接贴脚本 | 装了它的那个浏览器 |
填地址时有一个坑:本地文件。Firefox 认 file:///D:/proxy.pac 这种写法;Windows 代理页和 macOS 的脚本栏对本地路径的支持时好时坏,稳妥的做法是用切换器的 PAC 情景模式把脚本整段贴进去,或者用客户端生成的那条 http 地址。Chrome 和 Edge 的入口在代理设置这一栏按系统各写了一篇,Firefox 那页的三种选法见 Firefox 那一篇。
填在系统这一层,管的是整台机器,不算「只让浏览器走」;要只管一个浏览器,用 Firefox、切换器或启动参数那三个位置,只让浏览器走那一篇比过三条路的代价。
PAC、切换器规则、客户端规则是三层
从浏览器往外数:
- 切换器的「自动切换」规则,本质也是它替你生成的一段 PAC。
- 你自己填的 PAC。
- 客户端里的规则模式。
同一个请求最多经过这三道判断,哪一道说「直连」,后面的就看不到它。三层各写一套、互相矛盾,表现是该走的没走。常见搭法是只留一层:浏览器这边用 PAC 分,客户端开全局;或者 PAC 不用,浏览器全交给端口,客户端自己分。分流这条词条讲两层怎么配合。
还有一件事和 PAC 无关但常被当成 PAC 的问题:浏览器开着安全 DNS 时,域名解析绕过客户端,按域名写的规则会对不上,安全 DNS 那一篇单独讲。
三个常见坑
- 返回值拼错。
PROXY和DIRECT都是大写,中间一个空格,地址和端口之间是英文冒号。写错了浏览器不报错,只是全部直连。 - 缓存。改完脚本没反应,多半是旧的还在用,按上表各自的办法刷新一次。
- 填的端口和客户端不一致。客户端改了端口,PAC 里还是旧数字,所有命中的网址都打不开,表现和客户端没开一样。
34 家里谁的订阅这样接省事
PAC 里写的是端口,端口来自把订阅导进通用客户端。书签栏这 34 家里,官网写明了能导进通用客户端、面板里就能复制订阅,或者协议本身是通用客户端都认的那几种,这条路走得顺:
- 跨界云:订阅登录面板就能复制,官网写了 v2rayN、Clash 系、Shadowrocket 都能导;码 kuajie 老账号新账号都按 8 折,跨界年付版除外。
- 微风:面板里能复制,协议 VLESS,挑一个认它的客户端导进去就有端口。
- U1S1:协议 Shadowsocks,官网列了 Windows、Mac、安卓、iOS 四个系统,台数不限,订阅给法没见到写法,登录面板看。
- 闪跃:官网写了订阅能导通用客户端,也有自家客户端,线路写的是 IPLC;码 shanyue 任何档位都按 8 折。
- 一翻云:2026 年 4 月新开,订阅能导进通用客户端这一点机场方确认过,链接得找客服发;台数不限,协议 VLESS。按月能买,贴码 1FLYYUN 新开的账号 9 折。
拿到订阅、导进客户端、看一眼端口号,PAC 里那一行 127.0.0.1:7890 换成你的数字就通了。第一次买先按月,一翻云是书签栏第 1 个,第一笔最少的就是月付那一档。
这篇里点名的机场
一翻云
固定标签自家客户端四个系统都有,订阅能导第三方,不限台数
- 接入
- 两条路都行
- 月付起
- ¥20/月每月 150GB
- 优惠码
1FLYYUN
跨界云
官网点名 Clash 系能导,订阅面板就能复制
- 接入
- 本机客户端
- 月付起
- ¥20/月每月 120GB
- 优惠码
kuajie
U1S1
官网列了四个系统,SS 协议、IEPL,不限台数,¥20 起
- 接入
- 没见到写法
- 月付起
- ¥20/月每月 120GB
- 优惠码
U1S1888
闪跃
自家客户端开系统代理即可,也接通用客户端,8 折码
- 接入
- 两条路都行
- 月付起
- ¥24/月每月 150GB
- 优惠码
shanyue
微风
没有码,订阅面板里能复制,VLESS,有机场那边测的测速
- 接入
- 本机客户端
- 月付起
- ¥27/月每月 200GB
- 优惠码
- 没有码