在chrome扩展中添加或删除基于url的代理



我只想通过我的chrome扩展代理某些域,但我需要对当前url进行一些检查,以决定是否需要代理。

chrome.webRequest.onBeforeRequest.addListener(function(d){
chrome.proxy.settings.set({value: getProxyConfig(d.url), scope: 'regular'},function() {});
},{urls:[
"http://*/*",
"https://*/*"]},
["blocking"]);

函数getProxyConfig(d.url)是一个简单的函数,它将根据url返回适当的ProxyConfig对象(模式为directfixed_servers(。该函数不进行任何外部调用,只从本地存储中获取域列表并进行比较。

问题出在哪里?

Chrome尝试代理一些本应而非的URL,导致ERR_TUNNEL_CONNECTION_FAILED,因为代理只允许代理特定的域。如果我将getProxyConfig(d.url)输出记录到控制台,以查找正在下降的URL,我会看到与预期一样直接的模式。注意:html页面可能同时包含必须/不得代理的两个链接。

chrome.proxy.settings.set是异步的,所以我认为chrome.webRequest.onBeforeRequest可能在chrome.proxy.settings.set之前执行完毕

在发出请求时,不能自动修改代理。您必须创建一个自定义的PAC脚本,由脚本决定是否代理URL:

const config = {
mode: "pac_script",
pacScript: {
data: "function FindProxyForURL(url, host) {n" +
"  if (host == 'foobar.com')n" +
"    return 'PROXY blackhole:80';n" +
"  return 'DIRECT';n" +
"}"
}
}
chrome.proxy.settings.set(
{value: config, scope: 'regular'},
function() {}
)

关于chrome.webRequest.onBeforeRequest,这在设置代理之后被称为,因此您将在那里获得isProxy属性。

最新更新