gitlab rest api 通过名称查询方式(URL-encoded path of the project)一直404错误

问题发现

gitlab rest api 有个查询项目详情接口,如下:
gitlab rest api 通过名称查询方式(URL-encoded path of the project)一直404错误_第1张图片
其提供的 URL-encoded path of the project方式支持使用 命名空间/项目 的方式进行查询,但是有个前置操作,就是需要先将特殊字符进行 encode。比如我们要查询名称为 root/name 的项目详情,不能直接访问 /projects/root/name,需要将 root/name 先进行url encode(编码)再拼接到url上,即 /projects/root%2fname

最近调用接口时遇到了’诡异问题’,通过域名调用时一直报404错误,直接通过ip:port调用则没有问题。
即调用: https://xxx.com/projects/root%2fname 一直是404错误;(xxx.com代指域名)
调用:http://10.8.1.10:80/projects/root%2fname 则正常返回项目详情的json数据。(10.8.1.10是内网的gitlab地址)
奇了怪了,经过长时间搜索,终于在gitlab的官方issue上发现相似问题,API using url encoded paths is broken
其中有人提到,是反向代理的问题。反向代理会自动将url decode,再进行代理转发。
好了,有了方向,下面探究反向代理到底干了啥好事。

问题探究

问了一下gitlab维护人员,其确实使用nginx将域名代理到gitlab服务器,基于上面提出的问题,探究Nginx 的url decode 到底是怎么回事,详见:Nginx 自动url decode探究及如何避免url decode

结论就是,Nginx 在某些配置确实存在自动url decode的情况。
好了,问题找到,解决。

解决

修改nginx配置,避免进行url decode。参见:Nginx 自动url decode探究及如何避免url decode

当然啦,如果你不是使用nginx代理,请自行搜索调整相关配置。

reference:
https://docs.gitlab.com/ee/api/README.html#namespaced-path-encoding
https://docs.gitlab.com/ee/api/projects.html#get-single-project
无法使用编码后的路径访问api


end

你可能感兴趣的:(GitLab,异常小记,gitlab,rest,api,URL-encoded,namespaced-path,path-encoding)