“unsupported protocol scheme”错误源于goproxy含http://或协议不匹配,须统一改为https://;私有模块需精确配置goprivate跳过代理;-x日志不显示direct行为,应使用godebug=http2debug=2排查。

go mod download 报错 “unsupported protocol scheme”
这是典型的代理 URL 格式错误,go mod download 拒绝解析非 https:// 开头的地址。Go 1.13+ 强制要求代理必须是 HTTPS 协议,http:// 会被直接忽略并报此错。
- 执行
go env GOPROXY,如果输出包含http://goproxy.cn或http://mirrors.aliyun.com/goproxy/,就是根源 - 国内主流代理(如
https://goproxy.cn、https://mirrors.tuna.tsinghua.edu.cn/go/modules/)全部只支持 HTTPS,不提供 HTTP 端口 - 临时测试时误写
GOPROXY=http://localhost:8080也会触发该错误——即使本地服务跑在 HTTP 上,Go 也不认 - 修复方式唯一:把所有
http://替换为https://,例如go env -w GOPROXY=https://goproxy.cn,direct - 注意阿里云镜像路径末尾必须带斜杠:
https://mirrors.aliyun.com/goproxy/(缺斜杠会 404,但错误表现仍是 “unsupported protocol scheme”)
GO111MODULE=on 但 GOPROXY 仍不生效
模块模式开了,代理却没走,常见于环境变量被覆盖或 IDE 未同步。这不是协议问题,而是 Go 工具链根本没读到你设的 GOPROXY。
- 运行
go env GO111MODULE,确认输出是on(不是auto);auto在有vendor目录时会退化为 GOPATH 模式,跳过代理 -
go env GOPROXY输出为空?说明环境变量没写入,或 shell 配置未 source,或 Windows 下用了错误的命令(PowerShell 应用$env:GOPROXY="https://goproxy.cn",不是export) - VS Code / Goland 中依赖下载失败?IDE 启动时通常不读取 shell 的
.zshrc或.bash_profile,需在 IDE 设置里单独填入GOPROXY环境变量 - CI 脚本中漏了
go env -w?Docker 构建或 GitHub Actions 里,每次都是干净环境,必须显式设置,不能依赖本地配置
私有模块触发 “unsupported protocol scheme”
看起来像协议错误,实际是 GOPRIVATE 配置缺失导致 Go 尝试用 HTTPS 代理访问内网地址,而内网 Git 地址通常是 git@git.internal.company.com 或 ssh:// 协议,Go 无法将其转成 HTTPS URL。
- 现象:执行
go mod download卡在某个私有模块,日志出现unsupported protocol scheme "git"或"ssh" - 根本原因:Go 默认对所有模块走代理,但
git@和ssh://这类非 HTTP 协议无法被代理理解 - 解决办法不是改协议,而是让 Go 跳过代理——把域名加进
GOPRIVATE:go env -w GOPRIVATE="git.internal.company.com" -
GOPRIVATE值必须精确匹配模块导入路径的 host 部分,比如import "git.internal.company.com/my/lib"就填git.internal.company.com,不能多也不能少 - 多个域名用逗号分隔,不要空格:
go env -w GOPRIVATE="git.internal.company.com,github.com/my-org/private"
go mod download -x 日志里看不到 direct 请求
-x 参数只显示代理请求的 curl 命令,它完全不记录 direct 模式下的真实行为。你以为它在 fallback,其实它可能连 DNS 都没发出去就卡死了。
- 想确认是否真走
direct,别信-x日志——它只告诉你“我打算去哪”,不告诉你“我到底连没连上” - 真正要看直连细节,加
GODEBUG=http2debug=2:GODEBUG=http2debug=2 go mod download,会打印 TCP 连接、TLS 握手、HTTP 状态码等底层信息 - 如果看到
connectex: A connection attempt failed或dial tcp: i/o timeout,说明direct失败了,得检查内网 DNS、防火墙策略或 Git 服务器是否启用 HTTPS 接入 - 公司 GitLab 自建实例若只开 SSH 端口(22),默认
direct会失败;要么配GOPRIVATE+ 启用 HTTPS,要么强制走 SSH(需提前配置~/.gitconfig的 url.*.insteadOf)
https:// 开头,GOPRIVATE 必须和模块导入路径 host 完全一致,-x 日志不可信——这三个点最容易被忽略,但恰恰决定调试方向是否正确。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











