火狐pac脚本失效主因是加载失败或函数错误:pac url需返回合法mime类型且可访问,file://路径须绝对无空格中文,wpad可能覆盖手动配置,findproxyforurl返回值格式必须严格正确。

火狐浏览器能直接用 PAC 脚本做智能分流,但必须满足两个硬条件:一是 FindProxyForURL 函数语法完全合法且返回值格式正确;二是 PAC 文件 URL 可被火狐无拦截加载(HTTP(S) 需 MIME 类型为 application/x-ns-proxy-autoconfig,file:// 协议需路径绝对、无空格、无中文、无 BOM)。
为什么填了 PAC URL 却没生效?常见拦截点
火狐对 PAC 的加载和执行比 Chrome 更严格,很多“看似成功”的配置其实卡在第一步——根本没加载进来。
- 直接访问 PAC URL(比如在新标签页打开
http://intra.example.com/proxy.pac)必须返回纯文本 JavaScript,不能是 404、302 跳转、或服务器返回text/plain以外的 MIME 类型(尤其是text/html或application/octet-stream) -
file://路径必须用三个斜杠:file:///C:/proxy.pac(Windows),file:///Users/username/proxy.pac(macOS),file:///home/user/proxy.pac(Linux);路径中含空格或中文会导致静默失败 - 火狐默认启用 WPAD 自动发现,若局域网内存在
wpad.dat并被 DNS/DHCP 返回,它会优先加载那个,覆盖你手动填的 URL —— 此时需进about:config把network.proxy.wpad_url设为空,并确认network.proxy.ftp等其他 proxy.* 项未被插件意外改写
FindProxyForURL 函数写错最常导致全直连或全代理
这个函数不是“写了就能跑”,返回值字符串格式错一个字符(比如多空格、少引号、拼错 DIRECT)就会让火狐 fallback 到直连模式,且不报错。
- 必须返回字符串,不能是变量、不能是表达式结果,例如
return "DIRECT"✅,return DIRECT❌(未定义变量) - 多个代理可写成故障转移形式:
"PROXY 192.168.10.5:8080; PROXY 192.168.10.6:8080",注意分号后有空格,火狐会按序尝试 - 域名匹配优先用
dnsDomainIs(host, ".internal.corp")(匹配子域),不用shExpMatch(host, "*.internal.corp")(通配符在部分火狐版本中不可靠) - IP 段判断用
isInNet(host, "10.0.0.0", "255.0.0.0"),别用正则或字符串截取 —— PAC 环境不支持RegExp或host.includes()
企业环境强制锁定 PAC 配置必须用 firefox.cfg + autoconfig.js
仅靠图形界面设置会被用户轻易关闭或修改,IT 管控场景下必须走底层锁定。关键是两处易错:
-
firefox.cfg文件必须放在 Firefox 安装目录根目录(与firefox.exe同级),不能放错位置;首行必须是注释// IMPORTANT: Start your code on the 2nd line,否则整个文件被忽略 -
lockPref("network.proxy.autoconfig_url", "https://proxy.internal.co/firefox.pac")中的 URL 必须可被所有终端解析和访问,HTTPS 地址要确保证书有效(自签名证书会失败);若用 HTTP,需确认火狐未因安全策略禁用非 HTTPS PAC(network.proxy.allow_hijacking_localhost不影响此行为) - 修改后必须彻底关闭所有火狐进程(包括后台
firefox.exe),再重启,否则旧配置仍缓存生效
真正难的不是写规则,而是让火狐「信得过」这个脚本:从网络可达性、MIME 类型、文件编码、路径格式,到函数返回值的每一个字符,任意一环出问题都会静默失效。调试时别只看“设置已保存”,务必打开新标签页直接访问 PAC URL,再检查 about:networking#dns 里是否有 proxy 相关请求记录。











