优化系统代理排除地址配置,数据格式由Array改为Object,方便远程配置添加配置。

pull/274/head
王良 2024-02-22 00:59:29 +08:00
parent 92c580c487
commit 6a83041fe0
4 changed files with 195 additions and 87 deletions

View File

@ -34,7 +34,7 @@ const ProxyPlugin = function (context) {
log.info('关闭系统代理成功')
return true
} catch (err) {
log.error('关闭系统代理失败', err)
log.error('关闭系统代理失败:', err)
return false
}
},
@ -55,107 +55,186 @@ module.exports = {
use: 'local',
other: [],
setEnv: false,
excludeIpList: [
// region 中国大陆,可直接访问,无需代理
excludeIpList: {
// region 常用国内可访问域名
// 中国大陆域名,大部分可直接访问,无需代理
'*.cn',
'cn.*',
// 中国大陆
'*.cn': true,
'cn.*': true,
'*china*': true,
// 系统之家
'*.xitongzhijia.net': true,
// CSDN
'*.csdn.net',
'*.csdn.net': true,
// 百度
'*.baidu.com',
'*.baidu.com': true,
'*.baiducontent.com': true,
'*.bdimg.com': true,
'*.bdstatic.com': true,
'*.bdydns.com': true,
// 腾讯
'*.tencent.com',
'*.qq.com',
'*.weixin.com',
'*.wechat.com',
'*.tencent.com': true,
'*.qq.com': true,
'*.weixin.com': true,
'*.weixinbridge.com': true,
'*.wechat.com': true,
'*.idqqimg.com': true,
'*.gtimg.com': true,
'*.qpic.com': true,
'*.qlogo.com': true,
'*.myapp.com': true,
'*.myqcloud.com': true,
// 阿里
'*.alipay.com',
'*.taobao.com',
'*.tmall.com',
'*.aliyun.com',
'*.dingtalk.com', // 不排除会导致钉钉的团队文档打不开(原因未知)
'*.aliyun.com': true,
'*.alipay.com': true,
'*.taobao.com': true,
'*.tmall.com': true,
'*.alipayobjects.com': true,
'*.dingtalk.com': true,
'*.mmstat.com': true,
'*.alicdn.com': true,
'*.hdslb.com': true,
// Gitee
'gitee.com',
'*.gitee.com',
'*.gitee.io',
'gitee.com': true,
'*.gitee.com': true,
'*.gitee.io': true,
'*.giteeusercontent.com': true,
// Mozilla Firefox
'*.mozilla.org': true,
'*.mozilla.com': true,
'*.mozilla.net': true,
'*.firefox.com': true,
'*.firefox.org': true,
'*.mozillademos.org': true,
'*.mozillians.org': true,
'*.mozillians.net': true,
'*.mozillians.com': true,
// OSS
'*.sonatype.org',
'*.sonatype.org': true,
// Maven镜像
'*.maven.org',
'*.maven.org': true,
// Maven Repository
'*.mvnrepository.com',
'challenges.cloudflare.com', // 在访问 mvnrepository.com 的人机校验时使用,国内可直接访问,所以不需要代理,代理了反而变慢了。
'*.mvnrepository.com': true,
'challenges.cloudflare.com': true, // 在访问 mvnrepository.com 的人机校验时使用,国内可直接访问,所以不需要代理,代理了反而变慢了。
// 苹果
'*.apple.com',
'*.icloud.com',
'*.apple.com': true,
'*.icloud.com': true,
// 微软
'*.microsoft.com',
'*.windows.com',
'*.office.com',
'*.office.net',
'*.live.com',
'*.msn.com',
'*.microsoft.com': true,
'*.windows.com': true,
'*.office.com': true,
'*.office.net': true,
'*.live.com': true,
'*.msn.com': true,
// WPS
'*.wps.com',
'*.wps.com': true,
// 奇虎
'*.qihoo.com',
'*.qihucdn.com',
'*.qihoo.com': true,
'*.qihucdn.com': true,
// 360
'*.360.com',
'*.360safe.com',
'*.360buyimg.com',
'*.360buy.com',
'*.360.com': true,
'*.360safe.com': true,
'*.360buyimg.com': true,
'*.360buy.com': true,
// 京东
'*.jd.com',
'*.jcloud.com',
'*.jcloudcs.com',
'*.jcloudcache.com',
'*.jcloudcdn.com',
'*.jcloudlb.com',
'*.jd.com': true,
'*.jcloud.com': true,
'*.jcloudcs.com': true,
'*.jcloudcache.com': true,
'*.jcloudcdn.com': true,
'*.jcloudlb.com': true,
// 哔哩哔哩
'*.bilibili.com': true,
'*.bilivideo.com.com': true,
'*.biliapi.net': true,
// 移动
'*.10086.com': true,
'*.10086cloud.com': true,
// 移动139邮箱
'*.139.com': true,
// 迅雷
'*.xunlei.com': true,
// 网站ICP备案查询
'*.icpapi.com': true,
// AGE动漫
'*.agedm.*': true,
'*.zhimg.com': true,
'*.bdxiguaimg.com': true,
'*.toutiaoimg.com': true,
'*.bytecdntp.com': true,
'*.bytegoofy.com': true,
'*.toutiao.com': true,
'*.toutiaovod.com': true,
'*.aliyuncs.com': true,
'*.127.net': true,
'43.240.74.134': true,
// ZzzFun
'*.zzzfun.one': true,
'*.zzzfun.vip': true,
// 必应
'*.bing.com': true,
// 我的个人域名
'*.easyj.icu': true,
// 未知公司
'*.bcebos.com': true,
'icannwiki.org': true,
'*.icannwiki.org': true,
'*.sectigo.com': true,
'*.pingdom.net': true,
// endregion
// 本地地址,无需代理
'localhost',
'localhost.*', // 部分VPN会在host中添加这种格式的域名指向127.0.0.1,所以也排除掉
'127.*',
'test.*', // 本地开发时,测试用的虚拟域名格式,无需代理
'localhost': true,
'localhost.*': true, // 部分VPN会在host中添加这种格式的域名指向127.0.0.1,所以也排除掉
'127.*': true,
'test.*': true, // 本地开发时,测试用的虚拟域名格式,无需代理
// 服务器端常用地址,无需代理
'10.*',
'172.16.*',
'172.17.*',
'172.18.*',
'172.19.*',
'172.20.*',
'172.21.*',
'172.22.*',
'172.23.*',
'172.24.*',
'172.25.*',
'172.26.*',
'172.27.*',
'172.28.*',
'172.29.*',
'172.30.*',
'172.31.*',
'10.*': true,
'172.16.*': true,
'172.17.*': true,
'172.18.*': true,
'172.19.*': true,
'172.20.*': true,
'172.21.*': true,
'172.22.*': true,
'172.23.*': true,
'172.24.*': true,
'172.25.*': true,
'172.26.*': true,
'172.27.*': true,
'172.28.*': true,
'172.29.*': true,
'172.30.*': true,
'172.31.*': true,
// 局域网地址,无需代理
'192.168.*'
]
'192.168.*': true
}
},
status: {
enabled: false,

View File

@ -25,7 +25,7 @@ async function _winUnsetProxy (exec, setEnv) {
regKey.get('HTTPS_PROXY', (err) => {
if (!err) {
regKey.remove('HTTPS_PROXY', async (err) => {
log.info('删除环境变量https_proxy', err)
log.warn('删除环境变量https_proxy失败:', err)
await exec('setx DS_REFRESH "1"')
})
}
@ -41,17 +41,19 @@ async function _winSetProxy (exec, ip, port, setEnv) {
config = require('../../../config.js')
}
let lanIpStr = ''
for (const excludeIpPattern of config.get().proxy.excludeIpList) {
// 跳过起注释作用的数据
if (excludeIpPattern.indexOf('#') >= 0) {
continue
let excludeIpStr = ''
for (const ip in config.get().proxy.excludeIpList) {
if (config.get().proxy.excludeIpList[ip] === true) {
excludeIpStr += ip + ';'
}
lanIpStr += excludeIpPattern + ';'
}
// http=127.0.0.1:8888;https=127.0.0.1:8888 考虑这种方式
const proxyPath = extraPath.getProxyExePath()
await execFile(proxyPath, ['global', `http=http://${ip}:${port};https=http://${ip}:${port}`, lanIpStr])
const execFun = 'global'
const proxyAddr = `http=http://${ip}:${port};https=http://${ip}:${port}`
log.info(`执行“设置系统代理”的命令: ${proxyPath} ${execFun} ${proxyAddr} ${excludeIpStr}`)
await execFile(proxyPath, [execFun, proxyAddr, excludeIpStr])
if (setEnv) {
log.info('同时设置 https_proxy')
@ -77,8 +79,7 @@ const executor = {
return _winUnsetProxy(exec, setEnv)
} else {
// 设置代理
log.info('设置代理', ip, port, setEnv)
log.info('设置代理:', ip, port, setEnv)
return _winSetProxy(exec, ip, port, setEnv)
}
},

View File

@ -41,6 +41,9 @@ export default {
}
},
async apply () {
if (this.applyLoading === true) {
return
}
this.applyLoading = true
await this.applyBefore()
await this.saveConfig()

View File

@ -42,9 +42,9 @@
<a-button type="primary" icon="plus" @click="addExcludeIp()"/>
</a-col>
</a-row>
<a-row :gutter="10" v-for="(item,index) of getProxyConfig().excludeIpList" :key='index'>
<a-row :gutter="10" v-for="(item,index) of excludeIpList" :key='index'>
<a-col :span="22">
<a-input v-model="getProxyConfig().excludeIpList[index]"></a-input>
<a-input :disabled="item.value === false" v-model="item.key"></a-input>
</a-col>
<a-col :span="2">
<a-button type="danger" icon="minus" @click="delExcludeIp(item,index)"/>
@ -93,7 +93,8 @@ export default {
data () {
return {
key: 'proxy',
loopbackVisible: false
loopbackVisible: false,
excludeIpList: []
}
},
async created () {
@ -102,7 +103,13 @@ export default {
},
methods: {
async openExternal (url) {
this.$api.ipc.openExternal(url)
await this.$api.ipc.openExternal(url)
},
ready () {
this.initExcludeIpList()
},
async applyBefore () {
this.submitExcludeIpList()
},
async applyAfter () {
await this.$api.proxy.restart()
@ -121,11 +128,29 @@ export default {
getProxyConfig () {
return this.config.proxy
},
initExcludeIpList () {
this.excludeIpList = []
for (const key in this.config.proxy.excludeIpList) {
const value = this.config.proxy.excludeIpList[key]
this.excludeIpList.push({
key, value
})
}
},
addExcludeIp () {
this.getProxyConfig().excludeIpList.unshift('')
this.excludeIpList.unshift({ key: '', value: true })
},
delExcludeIp (item, index) {
this.getProxyConfig().excludeIpList.splice(index, 1)
this.excludeIpList.splice(index, 1)
},
submitExcludeIpList () {
const excludeIpList = {}
for (const item of this.excludeIpList) {
if (item.key) {
excludeIpList[item.key] = item.value
}
}
this.config.proxy.excludeIpList = excludeIpList
}
}
}