Node WebKit中如何通过PAC脚本实现按主机匹配的自定义代理配置
可实现,无需额外搭建本地Web服务
实现原理
NW.js 基于的 Chromium 网络栈原生支持通过 data: URI 加载内联 PAC 脚本,不受本地file://协议的安全限制,也不需要将PAC文件托管到Web服务器。动态生成的PAC内容可直接编码为data URI传入App.setProxyConfig,实现和Chrome内联PAC完全一致的效果。
操作逻辑
- 封装动态生成PAC内容的函数,根据传入的代理地址、端口拼接出匹配规则的PAC脚本
- 将PAC脚本内容用
encodeURIComponent编码,拼接成指定MIME类型的data URI:data:application/x-ns-proxy-autoconfig;charset=utf-8,<编码后的PAC内容> - 将拼接好的data URI作为第二个参数传入
App.setProxyConfig,第一个参数传空字符串即可生效
参考代码
const ngui = require('nw.gui'); // 动态生成匹配规则的PAC脚本 function buildPacContent(proxyHost, proxyPort) { return `function FindProxyForURL(url, host) { // 主机名包含example时走指定代理,其余直连 if (host.indexOf('example') > -1) { return 'PROXY ${proxyHost}:${proxyPort}'; } return 'DIRECT'; }`; } // 更新代理配置 function applyProxyConfig(proxyHost, proxyPort) { const pacRaw = buildPacContent(proxyHost, proxyPort); // 生成可被Chromium直接加载的data URI const pacUri = `data:application/x-ns-proxy-autoconfig;charset=utf-8,${encodeURIComponent(pacRaw)}`; ngui.App.setProxyConfig('', pacUri); } // 初始化代理示例 applyProxyConfig('127.0.0.1', 8888);
原有方案痛点的对应解决
- 无需写本地文件、启动Express服务托管PAC,逻辑链路短,无额外冗余操作
- 移除了同上下文运行Web服务的开销,
setProxyConfig的回调延迟、UI卡顿问题彻底消失 - 因为每次动态生成的PAC内容变化时,对应的data URI字符串会同步变化,不会命中Chromium的PAC缓存,不存在更新配置失效的问题。若遇到极端情况配置不生效,仅需在更新前临时调用一次
ngui.App.setProxyConfig('direct://', ''),间隔10~20毫秒再传入新的PAC配置即可,无额外复杂操作。
内容的提问来源于stack exchange,提问作者nick_j_white
相关产品推荐
相关产品推荐

