根本原因是PAC控制代理路由而非DNS解析,DoH强制将intranet.company等内网域名发往远程服务器导致解析失败;需配置network.trr.excluded-domains放行这些域名并验证PAC加载与函数正确性。

火狐浏览器在启用PAC自动代理脚本后,仍无法解析intranet.company、gitlab.internal等内部特殊域名,根本原因在于PAC控制的是**代理路由选择**,而非**DNS解析路径**;当network.trr.mode设为2(强制DoH)时,所有域名查询(包括内网域名)都会被加密发往远程DoH服务器,而这些服务器根本不认识私有域名,导致解析失败——此时即使PAC脚本正确返回DIRECT,也因DNS层面已失败而无法建立连接。
确认是否被DoH劫持了DNS解析
打开火狐地址栏,输入about:networking#dns并回车。
在“Recent Queries”表格中查找你刚访问过的内网域名(如intranet.company),重点看Protocol列:若显示HTTPS且状态为failed或timeout,说明DoH正在拦截解析;若显示UDP/TCP,则DNS未被劫持,问题出在别处。
检查页面顶部TRR Status行,若显示active,即表示DoH已启用,必须配置excluded-domains才能放行内网域名。
配置network.trr.excluded-domains强制绕过DoH
在地址栏输入about:config,点击“接受风险并继续”。
搜索network.trr.excluded-domains;若结果为空,右键空白处→新建→字符串,名称填network.trr.excluded-domains。
值填入纯域名列表,用英文逗号分隔,【不带http://、不加尾点、不写通配符】,例如:intranet.company,gitlab.internal,printer.lan。
注意:填internal可匹配dev.internal和prod.internal,但填*.internal无效——火狐不支持通配符语法。
验证PAC脚本是否真正生效
第一步:直接在新标签页中访问你配置的PAC URL(如http://intra.example.com/proxy.pac),必须看到纯文本JavaScript代码,且HTTP状态码为200;若出现404、302跳转、或页面显示HTML结构,说明PAC根本未加载成功。
第二步:访问about:config,确认network.proxy.type=2(自动配置模式),network.proxy.autoconfig_url值与你填入的URL完全一致(注意大小写、斜杠数量、file:///开头的三斜杠)。
第三步:检查WPAD是否覆盖手动配置——搜索network.proxy.wpad_url,若其值非空,说明局域网内存在wpad.dat,它正优先接管代理逻辑;此时需将其设为空字符串,并重启浏览器。
排查PAC函数内部DNS判断失效
方法一:用dnsDomainIs(host, ".internal.corp")替代shExpMatch(host, "*.internal.corp")
shExpMatch在部分火狐版本中不可靠,且不支持子域递归匹配;dnsDomainIs能准确识别intranet.internal.corp这类完整子域,是企业环境唯一推荐的域名匹配方式。
方法二:IP段判断必须用isInNet(host, "10.0.0.0", "255.0.0.0")
PAC环境不支持正则表达式、host.includes()或字符串截取;直接写if (host === "10.1.2.3")会漏掉整个网段,必须用isInNet进行掩码比对。
方法三:返回值必须是字符串字面量
return "PROXY 192.168.10.5:8080"✅,return PROXY + " 192.168.10.5:8080"❌(变量PROXY未定义);return "DIRECT"✅,return DIRECT❌(未加引号即引用未声明变量,火狐静默fallback为直连)。


















