GitLab通过namespace获取不到项目
出了什么问题
在k8s上部署gitlab,然后用nginx代理转发请求。 根据gitlab的API文档:
GET /projects/:id
这里的ID可以是项目的ID,也可以是由namespace与项目名称用%2F连接起来的字符串,而且这个%2F必须保持URL编码、不能被解码成/。(文档链接)
举个例子,比如有个xxx/project的项目,它的ID是2,可以用GET /projects/2也可以用GET /projects/xxx%2Fproject来取得项目信息。
问题就出在我可以用前者获得项目信息,后者会得到{"message":"404 Project Not Found"}
问题的原因在哪里
问题出在Nginx代理转发请求:当proxy_pass的URL里带有URI部分时,Nginx会用规范化(解码)后的路径去替换匹配到的前缀,把%2F解码成/,就会导致Gitlab后端404。
问题如何解决
在proxy_pass的URL后面加上$request_uri(它保存的是客户端发来的原始、未解码的请求URI):
proxy_pass http://gitlab$request_uri;