You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:27:01