移动端内网域名无法解析?检查 PAC 文件中的 isResolvable 函数
当移动端设备无法访问内网域名时,应检查 Proxy Auto-Configuration 文件中 FindProxyForURL 函数是否正确调用了 isResolvable 函数。
确认 PAC 文件是否定义了 FindProxyForURL 函数
Proxy Auto-Configuration (PAC) 文件本质上是一个包含 JavaScript 函数的文本文件,用于自动决定浏览器的请求路径。该文件必须保存为 .pac 扩展名,并且 MIME 类型应设置为 application/x-ns-proxy-autoconfig。文件的核心内容是一个名为 FindProxyForURL 的函数,浏览器在发起请求时会调用此函数并传入 URL 和主机名作为参数。如果文件内容不包含这个函数,或者函数定义不完整,浏览器将无法根据规则自动选择直连或代理,导致内网域名解析失败。
在检查 PAC 文件时,首先确认文件头部是否声明了正确的 MIME 类型。接着,使用文本编辑器打开文件,查找 function FindProxyForURL(url, host) 这一行。如果找不到该函数,或者函数体为空,那么浏览器将无法执行任何代理逻辑。确保函数定义完整且语法正确是解决内网域名访问问题的第一步。
验证函数逻辑中是否调用了 isResolvable 函数
PAC 文件中的 FindProxyForURL 函数通常包含逻辑判断,以决定是让浏览器直接访问目标主机,还是通过代理服务器转发请求。一个常见的场景是,当内网 DNS 服务器只能解析内部主机名时,需要编写逻辑来区分可解析和不可解析的域名。isResolvable 函数是 PAC 规范中提供的内置函数,用于测试主机名是否可以被解析。如果函数逻辑中没有调用 isResolvable,那么浏览器将无法区分内网和外网域名,可能导致内网请求被错误地转发到代理服务器,或者外网请求被错误地直连。
检查函数逻辑时,重点查看 return 语句之前的条件判断部分。如果代码中存在类似 if (isResolvable(host)) 的判断,说明函数试图利用 DNS 解析能力来决定路由。如果缺少这一步,或者使用了其他不可靠的方法(如硬编码域名列表)来替代,那么在移动端网络环境变化时,内网访问可能会失败。确保使用 isResolvable 是实现智能路由的关键。
检查函数返回值是否符合预期路由规则
FindProxyForURL 函数的返回值决定了浏览器的最终行为。根据 PAC 规范,返回字符串 DIRECT 表示直连,返回字符串 PROXY host:port 表示通过指定代理服务器连接。在处理内网域名时,正确的逻辑通常是:如果主机名可解析,则直连;否则,走代理。如果函数返回了错误的指令,例如对可解析的内网域名返回了 PROXY,那么浏览器将尝试通过代理访问内网,这通常会失败,因为代理服务器通常无法解析内网域名。
可以通过模拟测试来验证返回值。假设内网 DNS 只能解析 example.internal,外部域名无法解析。正确的 PAC 逻辑应返回 DIRECT 给 example.internal,返回 PROXY proxy.example.com:8080 给外部域名。如果函数返回了相反的结果,或者返回了空值,那么内网访问将无法建立。检查返回值是确认 PAC 配置生效的最终步骤。
使用浏览器开发者工具验证 PAC 文件加载情况
在移动端浏览器中,可以通过开发者工具的配置页面加载 PAC 文件,以验证其是否被正确识别和执行。在 Chrome 或 Firefox 的移动调试模式下,找到网络代理设置,输入 PAC 文件的 URL。如果 PAC 文件有效,浏览器通常会显示“已配置”或类似的提示。如果显示错误或无法加载,说明 PAC 文件路径错误、服务器不可访问或文件内容有误。
加载 PAC 文件后,可以进一步检查网络请求。在开发者工具的 Network 面板中,查看对内网域名的请求。如果请求被发送到了代理服务器的端口(如 8080),说明 PAC 逻辑可能错误地选择了代理。如果请求直接发送到了目标 IP,说明 PAC 逻辑正确地选择了直连。通过实际的网络请求路径,可以直观地验证 PAC 文件中 FindProxyForURL 函数的执行结果。
资料与延伸阅读
你可以通过以下原始资料核对文中概念,并继续深入阅读。