使用GitLab REST API下载子文件夹文件遇404错误求助
1. 检查URL编码是否正确(最可能的原因)
GitLab API的/repository/files端点要求路径参数(path)必须双重URL编码,尤其是包含/的子路径。你当前用的Build%2Ftest%2Etxt是单次编码,当请求经过Nginx代理时,Nginx会自动解码一次,导致GitLab实际收到的路径是Build/test.txt,而API期望的是编码后的分隔符%2F。
解决方法:对路径进行双重编码,把/编码成%252F,.编码成%252E,修改后的curl命令:
curl --header "PRIVATE-TOKEN: <private-token>" "https://my.domain.com/gitlab/api/v4/projects/2/repository/files/Build%252Ftest%252Etxt&ref=main"
(注:如果你的GitLab实际挂载在/dev路径下,把URL里的/gitlab改成/dev)
2. 验证请求路径与Nginx代理配置是否匹配
从你的Nginx配置来看,GitLab代理的路径是/dev,但你的curl请求用的是/gitlab/api/v4,这明显不匹配。如果GitLab的external_url设置的是https://my.domain.com/dev,那么所有API请求的前缀应该是/dev/api/v4,而不是/gitlab/api/v4。
- 检查GitLab的external_url配置:在GitLab容器中查看
/etc/gitlab/gitlab.rb里的external_url字段,确认是否为https://my.domain.com/dev。 - 修正curl请求的路径前缀,比如:
curl --header "PRIVATE-TOKEN: <private-token>" "https://my.domain.com/dev/api/v4/projects/2/repository/files/Build%252Ftest%252Etxt&ref=main"
3. 检查Nginx代理的路径传递与头配置
你的Nginx配置中,location /dev和proxy_pass http://193.174.29.12:1234/dev的写法是对的,但存在一个头名错误:
原配置中的X-Forwarded-For-Proto是错误的,正确的头名是X-Forwarded-Proto,这个错误可能导致GitLab生成错误的内部路径,进而引发404。
修正后的Nginx配置片段:
proxy_set_header X-Forwarded-Proto https; # 替换原有的X-Forwarded-For-Proto
4. 直接访问GitLab容器验证API(排除代理问题)
绕过Nginx,直接访问GitLab容器的端口,测试API是否正常:
curl --header "PRIVATE-TOKEN: <private-token>" "http://193.174.29.12:1234/dev/api/v4/projects/2/repository/files/Build%2Ftest%2Etxt&ref=main"
如果这个请求正常,说明问题出在Nginx代理配置;如果还是404,说明GitLab本身的配置或项目路径有问题(比如分支名错误、文件路径大小写不匹配,GitLab对路径大小写敏感)。
5. 确认文件路径的大小写
GitLab仓库的路径是大小写敏感的,检查你的请求路径Build/test.txt是否和仓库中的实际路径完全一致(比如仓库里是build/test.txt而不是Build/test.txt)。
内容的提问来源于stack exchange,提问作者Tabea

