【PAC文件故障排查合集】不生效/只想让特定网站直连…常见的坑用Q&A解答
代理的PAC文件很方便,但真正投入运用时,会遇到意外多的坑:「改了却不生效」「只想让特定网站直连」「根本不起作用」等。本文以Q&A形式整理了实务中常见的问题。基础写法在上一篇入门文章中已说明,请一并参阅。
※本文为技术示例介绍。行为因浏览器·操作系统·网络环境而异。各Q&A包含相关图书的联盟链接(亚马逊联盟)。
Q1 改了PAC文件却不生效
A. 这是最常见的情况。多数原因是「缓存」。浏览器或操作系统会将PAC文件缓存一段时间,因此更新后可能不会立即生效。尤其Internet Explorer系会在内部缓存自动代理脚本。
应对方法:完全重启浏览器;在PAC的URL上加版本查询参数(如 proxy.pac?v=2)使其被识别为「另一个文件」;在分发服务器端调整 Cache-Control 头等,都很有效。IE可通过组策略停用自动代理脚本的缓存。
要点 当「改了却没改好」时,先怀疑缓存。给URL加查询参数是快速排查的方法。
相关图书(PR) 想学习分发服务器与缓存控制的话。 ▶ 在亚马逊搜索
Q2 只想让特定网站不经代理、直接连接
A. 用 shExpMatch 判断主机名,符合条件时返回 DIRECT。判断自上而下依次评估,在第一个匹配处结束。想排除的网站尽量写在前面是诀窍。
function FindProxyForURL(url, host) {
// 仅此域名直连
if (shExpMatch(host, "*.example.com")) {
return "DIRECT";
}
// 其余经由代理
return "PROXY proxy.example.com:8080";
}要点 shExpMatch 使用通配符(shell 式),并非正则表达式。写成「*.example.com」这样。
相关图书(PR) PAC即JavaScript。想打好基础的话。 ▶ 在亚马逊搜索
Q3 内部系统直连,仅外部网站经代理
A. 内网判断可组合使用:判断不含点的主机名的 isPlainHostName、判断内部域名的 dnsDomainIs、按IP范围判断的 isInNet。内部用 DIRECT、其余经代理,是经典写法。
function FindProxyForURL(url, host) {
// 内部·内网直连
if (isPlainHostName(host) ||
dnsDomainIs(host, ".corp.local") ||
isInNet(host, "10.0.0.0", "255.0.0.0")) {
return "DIRECT";
}
// 其余为外部代理
return "PROXY proxy.example.com:8080";
}要点 isInNet 与 dnsResolve 需要DNS查询,容易造成延迟。若用字符串判断(如 shExpMatch)即可,则优先使用。
相关图书(PR) 用于内部网络的设计·构建。 ▶ 在亚马逊搜索
Q4 PAC文件根本不起作用·未被加载
A. 先怀疑三点。①语法错误(缺少分号、函数名拼写错误、括号不匹配等,只要有一个,整个脚本就不工作);②分发问题(PAC的URL能否访问、是否被防火墙拦截);③MIME类型。在分发服务器上将 .pac 的MIME类型设为 application/x-ns-proxy-autoconfig 较为稳妥。
要点 近期浏览器可能限制以 file:// 放置的PAC。基本上以 HTTP(S) 分发更可靠。
相关图书(PR) 用于连接不上时的排查·调查。 ▶ 在亚马逊搜索
Q5 代理宕机时想自动切换(故障转移)
A. 将返回值以分号分隔指定多个,会自左向右依次尝试,无响应则回退到下一个。最后放 DIRECT,当所有代理都不可用时切换为直连。
function FindProxyForURL(url, host) {
// 按 proxy1 -> proxy2 -> 直连 的顺序尝试
return "PROXY proxy1.example.com:8080; " +
"PROXY proxy2.example.com:8080; DIRECT";
}相关图书(PR) 想学习服务器冗余·负载均衡的话。 ▶ 在亚马逊搜索
Q6 只有部分浏览器不行 / 省略端口就不工作
A. 容易忽略的是端口省略。像「PROXY proxy.example.com」这样省略端口,在部分浏览器(Firefox系等)中不工作。即便是默认的80,也务必写到「:80」。此外 DIRECT 和 PROXY 关键字为大写(区分大小写)。
要点 https 的 URL 在传给 PAC 时路径与查询会被去除,只剩主机名。若想按URL的细分路径分流,请注意 https 无法判断。
相关图书(PR) 想深入 HTTP 与协议机制的话。 ▶ 在亚马逊搜索
Q7 如何测试·调试PAC文件?
A. 在全公司铺开前,先在本地验证。使用 pactester 等工具,可确认指定URL被分配到哪个代理。排查的基本步骤是:先在浏览器直接指定代理,确认去掉PAC后能否通信;然后逐条加入PAC条件,便于定位原因。
要点 myIpAddress 在某些环境(多网卡或VPN)下可能返回意外值,一般建议避免使用。
相关图书(PR) 想提升网络运维实务能力的人。 ▶ 在亚马逊搜索
小结
PAC文件的问题,常见于「缓存导致不生效」「语法错误使整体停止」「省略端口导致部分浏览器不工作」。遇到困难时,先在浏览器直接指定代理进行排查,再逐条加回PAC条件,是捷径。基础写法整理在上一篇入门文章中,请一并参阅。
Robin Planning 也可提供支持 内部网络与代理相关的设置·故障应对咨询亦可受理。欢迎随时联系。
免责:本文为以一般信息提供为目的的技术备忘,不保证运行结果。行为因浏览器·操作系统·网络环境而异。联盟:Robin Planning为亚马逊联盟计划参与者,可能通过本站链接的购买获得推荐费。



留言