使用Golang下载GitHub私有仓库Release附件返回404问题求助
问题原因
你遇到的404错误是Go标准库http.Client的默认重定向策略导致的:
- 你的curl命令添加了
-L参数会自动跟随重定向,且默认会在相关域名的重定向链路中保留Authorization等请求头 - GitHub私有仓库的release下载链接会先返回302重定向到CDN资源地址,Go默认的重定向逻辑会主动丢弃跨域名重定向请求中的Authorization敏感头,导致重定向后的请求没有携带认证信息,GitHub因此返回404(私有仓库会对未授权请求统一返回404避免泄露资源存在性)
修复方案
自定义http.Client的重定向处理逻辑,在重定向时保留需要的请求头即可,修改后的下载函数核心代码如下:
import "errors" func dl(address, fileName string, headers map[string]string) error { // 自定义重定向策略,保留请求头 client := &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { if len(via) >= 10 { return errors.New("exceeded max 10 redirects") } // 复制原始请求的所有头到重定向请求 for k, v := range via[0].Header { req.Header[k] = v } return nil }, } req, err := http.NewRequest("GET", address, nil) if err != nil { return err } for k, v := range headers { req.Header.Set(k, v) } response, err := client.Do(req) if err != nil { return err } defer response.Body.Close() // 剩余原有逻辑不变 // ... rest of the function }
可选检查项
如果修改后仍然报错,可以额外排查:
- 确认你的GitHub token拥有
repo权限,足够读取私有仓库的release资产 - 确认下载地址拼写和curl命令中完全一致,避免tag名、文件名的拼写错误
内容的提问来源于stack exchange,提问作者Farshid
相关产品推荐
相关产品推荐

