Go模块代理不支持域名级排除,必须用GONOPROXY按模块路径前缀匹配(如git.example.com/internal/lib),而非HTTP域名;GOPROXY=direct会全局禁用代理,无法实现部分绕过。

go.mod 中无法直接配置域名级代理排除
Go 的模块代理机制(GOPROXY)本身不支持“白名单式排除”,即不能写成「用 proxy.golang.org,但跳过 example.com」这种逻辑。所有模块请求默认走代理,除非显式绕过——而绕过方式只对整个模块路径生效,不是按域名粒度控制。
用 GONOPROXY 排除特定模块路径(而非域名)
真正起作用的是 GONOPROXY,它匹配模块路径前缀,不是 HTTP 域名。比如你想让 git.example.com/internal/lib 不走代理,就得把它加进 GONOPROXY:
export GONOPROXY="git.example.com/internal/lib,github.com/myorg/private"
注意三点:
-
GONOPROXY匹配的是模块导入路径(如git.example.com/internal/lib),不是https://git.example.com这样的 URL - 如果模块路径带子路径(如
git.example.com/internal/lib/v2),且未在go.mod中声明为独立模块,则只需写git.example.com/internal/lib即可覆盖 - 多个值用逗号分隔,支持通配符
*,但仅限前缀匹配(git.example.com/*合法,*.example.com不合法)
为什么不能靠 GOPROXY=direct 或改 DNS 解决?
设 GOPROXY=direct 会全局禁用代理,所有模块都直连源站——这违背“只排除部分”的初衷;改本地 DNS 或 hosts 只影响解析,不影响 Go 的代理路由逻辑。Go 在发起请求前就已根据 GOPROXY 和 GONOPROXY 决定走哪条路径,根本不会查 DNS 去判断是否该绕过。
常见误操作:
- 把
GONOPROXY设成example.com—— 错,模块路径不含协议和端口,必须是实际 import path - 在
go.mod里写// indirect或注释掉依赖来“规避” —— 无效,Go 仍会尝试解析该模块 - 以为
replace能替代代理排除 ——replace是重定向本地路径,不解决网络路由问题
私有仓库场景下最稳的组合配置
当你的组织同时用公有模块(走 proxy.golang.org)和私有模块(如 git.internal.company.com/go/foo)时,推荐这样设:
export GOPROXY="https://proxy.golang.org,direct"<br>export GONOPROXY="git.internal.company.com/go/*,company.com/internal/*"
关键点:
- 用
direct作为 fallback,确保GONOPROXY匹配失败时仍能直连(比如某些未发布到公共 proxy 的模块) -
GONOPROXY值必须与go.mod第一行的module声明完全一致或为其前缀 - 若私有模块使用自签名证书,还需额外设
GOSUMDB=off或配GOSUMDB=sum.golang.org+https://sum.golang.org加证书信任
真正容易被忽略的是:Go 不会自动推导域名和模块路径的关系,哪怕你把私有 Git 服务部署在 gitea.example.com,也得在 GONOPROXY 里写清楚模块路径,比如 gitea.example.com/myteam/pkg —— 少一个字符都不行。

















