PAC模式是什么?和全局模式的区别、设置与不生效排查
PAC模式是一种自动选择代理的方式:浏览器把要访问的网址交给一段配置脚本,脚本返回“直连”或“使用哪个代理”。它本身不会提供节点,也不会把整台电脑的流量都接管过去。
如果你遇到“浏览器能用,其他软件不行”或“切到全局了,某个网站还是直连”,先检查请求有没有进入代理客户端。PAC 决定把请求送到哪里,客户端的规则或全局模式再决定收到的请求怎样转发。两个地方都可能影响结果。
PAC模式如何决定代理或直连
PAC 是 Proxy Auto-Configuration 的缩写,配置文件通常以 .pac 结尾。核心是一段名为 FindProxyForURL(url, host) 的 JavaScript 函数,接收网址与主机名,返回代理选择。MDN 的 PAC 文档说明了这些参数和返回值。
最常见的两种结果是 DIRECT 和 PROXY 主机:端口。前者表示直接连接目标,后者表示把请求交给指定的 HTTP 代理。脚本可以按域名选择,但“自动”只代表自动执行已有判断,不代表它知道所有网站应该怎么访问。
一个网站是否走代理,取决于你使用的脚本。如果脚本没有匹配到它,最后又默认返回直连,这个网站就会走本地网络。换了节点却仍然无法访问,可能根本没有请求到达新节点。
PAC和全局模式为什么会同时影响结果
下面把几个经常混用的设置放在一起。表里的“全局模式”指代理客户端内的转发策略,具体软件的命名可能不同。
| 设置 | 主要决定什么 | 要先确认什么 |
|---|---|---|
| PAC 自动配置 | 支持该配置的应用把请求交给哪个代理,或直连 | 应用是否读取了这份脚本 |
| 手动系统代理 | 为应用提供固定代理地址,通常还有例外列表 | 应用是否遵循系统代理 |
| 客户端规则模式 | 已进入客户端的请求按规则选择出口 | 请求是否进入客户端、命中哪条规则 |
| 客户端全局模式 | 已进入客户端的请求统一使用选定策略 | 有无流量绕过客户端 |
| TUN 接管 | 从网络接口层面把更多流量送入客户端 | 路由、排除项和转发能力是否符合需求 |
例如,浏览器先通过 PAC 得到 DIRECT,请求便直接发出。此时客户端里的全局开关没有机会处理这条请求。另一个网站被 PAC 送进代理后,才会受到客户端出口策略的影响。
反过来,PAC 把请求交给本地客户端,也不能保证客户端一定转发到远端:客户端还可能有自己的直连规则。排查时需要同时观察应用端的代理配置和客户端日志。
这是一种定位思路,不能据此认定所有软件都使用相同实现。关于接管范围,可以继续看TUN模式和系统代理的区别。
Windows里先看脚本地址和代理端口
在 Windows 11 中打开“设置 → 网络和 Internet → 代理”,检查自动代理设置里的“使用设置脚本”。微软的代理设置说明介绍了自动检测、脚本配置和手动代理这几种方式。
如果这里开启了脚本,记录脚本地址,再核对以下几项:
- 地址能否加载。 本地地址依赖客户端提供服务;客户端退出后,原地址可能无法使用。不要在不清楚原配置用途时覆盖公司网络提供的脚本。
- 脚本返回的代理端口是否正确。 HTTP 代理入口与 SOCKS 入口可能不同。以当前客户端显示的监听端口为准,不要照搬别人的数字。
- 浏览器有无独立设置。 浏览器扩展、自定义代理或组织策略可能改变实际使用的配置。记录这些设置,才能做有意义的对照。
- 目标请求有没有进入客户端。 清理或标记当前日志,再刷新一个具体网页,观察域名、时间和出口。不要只凭托盘图标判断。
页面上的“自动检测设置”也不等于“使用设置脚本”。前者涉及发现配置,后者是使用已经指定的脚本地址。Chromium 代理文档区分了手动配置、PAC 和自动发现。
脚本里的DIRECT值得单独检查
下面是解释结构的示例,不是可以直接导入的成品。127.0.0.1:18080 是示例 HTTP 代理入口;实际使用前必须换成你的客户端地址和端口。
function FindProxyForURL(url, host) {
if (host === "example.com" || dnsDomainIs(host, ".example.com")) {
return "PROXY 127.0.0.1:18080";
}
return "DIRECT";
}
这段脚本仅把指定域名及其子域名交给代理,其余请求都直连。它展示了两件排障时很实用的事:需要查看匹配条件,也需要查看最后的默认返回值。
另一个常见返回值是 PROXY 127.0.0.1:18080; DIRECT。它提供了代理之外的直连候选。在支持这种回退的实现中,代理不可用时,浏览器可能继续尝试本地网络。网页仍能打开,不能单独证明代理还在工作。 回退细节以浏览器实现为准,Chromium 文档也说明了代理候选与回退机制。
还要留意按 URL 路径编写的规则。Chrome 会对传入 PAC 的 HTTPS 地址裁剪路径和查询参数,因此不要想当然地用 /某个页面 来区分 HTTPS 请求;按主机名判断通常更容易核对。这个限制在前面的 MDN 文档中有说明。
用同一个请求定位问题
每次只调整一个设置,并保持测试网址、节点和网络相同。记录改动前后的客户端日志,比一次开关五六个选项更容易找出原因。
| 观察到的现象 | 优先核对的位置 | 下一步 |
|---|---|---|
| 某个网页失败,客户端没有对应请求 | 应用代理设置或 PAC 判断 | 检查脚本是否加载、是否返回直连 |
| 请求进入客户端,日志显示直连 | 客户端内部转发规则 | 检查命中规则和出口策略 |
| 请求进入客户端,远端连接超时 | 节点连接或网络路径 | 按节点超时排查顺序继续定位 |
| 网页能用,命令行或其他应用不能用 | 两个应用的代理配置差异 | 查失败应用是否支持系统代理或需要单独配置 |
| 退出客户端后网页仍能打开 | 直连、例外或回退路径 | 检查实际请求出口,别据此断定连接没断 |
一次 IP 查询只代表该次查询的请求出口;另一个应用可能使用不同路径。如果需要给某个程序单独设置代理,可以参考SOCKS5代理设置方法,同时核对软件是否支持相应协议。
常见问题
PAC模式是什么意思?
它通过配置脚本为请求选择直连或代理。它需要实际可用的代理入口,单独拿到一个 PAC 地址不能替代节点或代理服务。
PAC模式和全局模式哪个更好?
需要按域名选择访问路径、且应用支持自动代理配置时,可以使用 PAC。临时排查客户端内部规则时,全局模式有助于减少规则变量,但前提是请求已经进入客户端。
PAC模式和规则模式一样吗?
两者都可以包含判断条件,但执行位置不同。PAC 通常由支持它的应用执行;客户端规则模式在客户端收到请求后执行。看到相似的名称,也要核对软件说明。
PAC模式能代理游戏和所有UDP流量吗?
不能这样推断。配置脚本不会强制接管不支持它的应用;游戏、语音等还涉及 UDP 接管与转发。网页测试通过,也不能证明这些流量使用同一条路径。