[GH-ISSUE #1021] [Feature] 支持为每个任务自定义HTTP代理 #700

Closed
opened 2026-03-03 01:05:20 +03:00 by kerem · 1 comment
Owner

Originally created by @zuoliang0 on GitHub (Nov 3, 2025).
Original GitHub issue: https://github.com/certimate-go/certimate/issues/1021

功能描述 / Description

目前Certimate的域名监控仅能配置全局HTTP代理,但在实际应用场景下,部分域名/任务(如海外项目)需要使用代理,而另一些(如国内项目)则完全不需要代理。希望支持为每一个监控任务(或域名)单独自定义HTTP代理的配置项,实现更细粒度的代理控制。可能的方案包括:

  • 在创建或编辑域名监控任务时,允许设置独立的代理参数(如http、socks5等类型、代理地址及端口、认证信息等)。
  • 若未指定,任务默认继承全局代理配置。
    这样可以极大提升不同网络环境下的使用灵活度与兼容性。

(如有必要,也可考虑对不同协议支持自定义,比如http/https/tls等,或提供代理配置的模版/快捷选择方式。)

请求动机 / Motivation

现在中国大陆用户、海外用户和多项目并存时场景常见。全局代理配置会导致:

  • 部分国内域名反而因为走海外代理无法正常访问
  • 只需要某些任务设定代理时,反而缺乏灵活性,易导致误用和维护成本提升
    支持单任务自定义代理后,可提升大规模场景下的实用性,减少代理配置冲突,让工具更好地适用于多样化实际网络需求。

其他 / Miscellaneous

1. 配置结构层面建议

  • 配置结构设计
    增加每个任务(域名监控项)的可选 proxy 字段(如果为空则继承全局代理)。

    type MonitorTask struct {
        Domain string `json:"domain"`
        // ... 其他字段
        Proxy  *ProxyConfig `json:"proxy,omitempty"` // nil 表示用全局
    }
    
    type ProxyConfig struct {
        Type     string `json:"type"`   // "http" 或 "socks5"
        Address  string `json:"address"` // host:port
        Username string `json:"username,omitempty"`
        Password string `json:"password,omitempty"`
    }
    

    在全局配置中依旧保留 global proxy 字段。


2. 业务逻辑层建议

  • 选取代理的优先级
    在发起目标任务的网络请求前:

    1. 先判断当前任务的 Proxy 字段(task.Proxy)。
    2. 如果有,就用它,没有就 fallback 到全局 Proxy 配置。
    // 伪代码
    func getProxyForTask(task *MonitorTask, globalProxy *ProxyConfig) *ProxyConfig {
        if task.Proxy != nil {
            return task.Proxy
        }
        return globalProxy
    }
    

3. 下游 HTTP/S 请求建议

  • 为每个请求动态设置代理
    建议将 Go 的 http.Transport.Proxy 字段替换为自定义函数,支持动态按任务配置不同代理。

    tr := &http.Transport{
        Proxy: func(req *http.Request) (*url.URL, error) {
            proxyCfg := getProxyForTask(task, globalProxy)
            if proxyCfg == nil {
                return nil, nil // 直连
            }
            proxyURL := fmt.Sprintf("%s://%s", proxyCfg.Type, proxyCfg.Address)
            return url.Parse(proxyURL)
        },
        // ... 其他 Transport 字段
    }
    client := &http.Client{Transport: tr}
    

    如需 socks5,可用 golang.org/x/net/proxy

    // 设置 socks5 代理示例
    dialer, err := proxy.SOCKS5("tcp", proxyCfg.Address, auth, proxy.Direct)
    tr.Dial = dialer.Dial
    

4. 配置管理/界面建议

  • 前端/CLI 提供“为每个域名/任务自定义代理”配置入口(配置详情文档可参考抓取/分流类产品,如 Clash、Surge 等)。

5. 兼容性与默认行为

  • 最小化破坏性变更:已有配置文件不带 task 级代理时不影响老用户,升级方案用默认全局配置即可。

参考实现(Go 代码片段)

type ProxyConfig struct {
    Type     string // "http" or "socks5"
    Address  string // host:port
    Username string
    Password string
}

type MonitorTask struct {
    Domain string
    Proxy  *ProxyConfig // optional
}

func proxyFuncForTask(task *MonitorTask, global *ProxyConfig) func(*http.Request) (*url.URL, error) {
    return func(req *http.Request) (*url.URL, error) {
        p := global
        if task.Proxy != nil {
            p = task.Proxy
        }
        if p == nil {
            return nil, nil // no proxy
        }
        proxyStr := fmt.Sprintf("%s://%s", p.Type, p.Address)
        return url.Parse(proxyStr)
    }
}

// 创建 http.Client 时
tr := &http.Transport{
    Proxy: proxyFuncForTask(task, globalProxy),
}
client := &http.Client{Transport: tr}

如需支持 socks5,可以参考 golang.org/x/net/proxy

贡献 / Contribution

  • 我乐意为此贡献 PR! / I am interested in contributing a PR for this!
Originally created by @zuoliang0 on GitHub (Nov 3, 2025). Original GitHub issue: https://github.com/certimate-go/certimate/issues/1021 ### 功能描述 / Description 目前Certimate的域名监控仅能配置全局HTTP代理,但在实际应用场景下,部分域名/任务(如海外项目)需要使用代理,而另一些(如国内项目)则完全不需要代理。希望支持为每一个监控任务(或域名)单独自定义HTTP代理的配置项,实现更细粒度的代理控制。可能的方案包括: - 在创建或编辑域名监控任务时,允许设置独立的代理参数(如http、socks5等类型、代理地址及端口、认证信息等)。 - 若未指定,任务默认继承全局代理配置。 这样可以极大提升不同网络环境下的使用灵活度与兼容性。 (如有必要,也可考虑对不同协议支持自定义,比如http/https/tls等,或提供代理配置的模版/快捷选择方式。) ### 请求动机 / Motivation 现在中国大陆用户、海外用户和多项目并存时场景常见。全局代理配置会导致: - 部分国内域名反而因为走海外代理无法正常访问 - 只需要某些任务设定代理时,反而缺乏灵活性,易导致误用和维护成本提升 支持单任务自定义代理后,可提升大规模场景下的实用性,减少代理配置冲突,让工具更好地适用于多样化实际网络需求。 ### 其他 / Miscellaneous ### 1. 配置结构层面建议 - **配置结构设计** 增加每个任务(域名监控项)的可选 `proxy` 字段(如果为空则继承全局代理)。 ```go type MonitorTask struct { Domain string `json:"domain"` // ... 其他字段 Proxy *ProxyConfig `json:"proxy,omitempty"` // nil 表示用全局 } type ProxyConfig struct { Type string `json:"type"` // "http" 或 "socks5" Address string `json:"address"` // host:port Username string `json:"username,omitempty"` Password string `json:"password,omitempty"` } ``` 在全局配置中依旧保留 global proxy 字段。 --- ### 2. 业务逻辑层建议 - **选取代理的优先级** 在发起目标任务的网络请求前: 1. 先判断当前任务的 `Proxy` 字段(task.Proxy)。 2. 如果有,就用它,没有就 fallback 到全局 Proxy 配置。 ```go // 伪代码 func getProxyForTask(task *MonitorTask, globalProxy *ProxyConfig) *ProxyConfig { if task.Proxy != nil { return task.Proxy } return globalProxy } ``` --- ### 3. 下游 HTTP/S 请求建议 - **为每个请求动态设置代理** 建议将 Go 的 `http.Transport.Proxy` 字段替换为自定义函数,支持动态按任务配置不同代理。 ```go tr := &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { proxyCfg := getProxyForTask(task, globalProxy) if proxyCfg == nil { return nil, nil // 直连 } proxyURL := fmt.Sprintf("%s://%s", proxyCfg.Type, proxyCfg.Address) return url.Parse(proxyURL) }, // ... 其他 Transport 字段 } client := &http.Client{Transport: tr} ``` 如需 socks5,可用 [golang.org/x/net/proxy](https://pkg.go.dev/golang.org/x/net/proxy): ```go // 设置 socks5 代理示例 dialer, err := proxy.SOCKS5("tcp", proxyCfg.Address, auth, proxy.Direct) tr.Dial = dialer.Dial ``` --- ### 4. 配置管理/界面建议 - 前端/CLI 提供“为每个域名/任务自定义代理”配置入口(配置详情文档可参考抓取/分流类产品,如 Clash、Surge 等)。 --- ### 5. 兼容性与默认行为 - 最小化破坏性变更:已有配置文件不带 task 级代理时不影响老用户,升级方案用默认全局配置即可。 --- ### 参考实现(Go 代码片段) ````go type ProxyConfig struct { Type string // "http" or "socks5" Address string // host:port Username string Password string } type MonitorTask struct { Domain string Proxy *ProxyConfig // optional } func proxyFuncForTask(task *MonitorTask, global *ProxyConfig) func(*http.Request) (*url.URL, error) { return func(req *http.Request) (*url.URL, error) { p := global if task.Proxy != nil { p = task.Proxy } if p == nil { return nil, nil // no proxy } proxyStr := fmt.Sprintf("%s://%s", p.Type, p.Address) return url.Parse(proxyStr) } } // 创建 http.Client 时 tr := &http.Transport{ Proxy: proxyFuncForTask(task, globalProxy), } client := &http.Client{Transport: tr} ```` --- 如需支持 socks5,可以参考 [golang.org/x/net/proxy](https://pkg.go.dev/golang.org/x/net/proxy)。 ### 贡献 / Contribution - [ ] 我乐意为此贡献 PR! / I am interested in contributing a PR for this!
kerem 2026-03-03 01:05:20 +03:00
Author
Owner

@fudiwei commented on GitHub (Nov 4, 2025):

没有这样做的计划。你应该在代理层来控制流量是否要经过代理。

P.S. 请不要在 Issue 中使用 AI 生成一些看似正常实则胡说八道的内容了。

<!-- gh-comment-id:3485748346 --> @fudiwei commented on GitHub (Nov 4, 2025): 没有这样做的计划。你应该在代理层来控制流量是否要经过代理。 P.S. 请不要在 Issue 中使用 AI 生成一些看似正常实则胡说八道的内容了。
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/certimate#700
No description provided.