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

GitLab Docker实例外部URL配置异常:设置后出现重定向错误

GitLab配置后出现重定向循环问题排查

问题背景

通过Docker启动GitLab容器,搭配Nginx反向代理实现HTTPS访问。初始状态下可通过https://MY_URL.com正常访问,但仓库克隆链接显示为HTTP,且CI任务使用HTTP地址时出现基础认证错误。添加external_url 'https://MY_URL.com'并重新配置GitLab后,访问HTTP/HTTPS地址均出现“错误重定向”,Nginx日志仅显示301状态码。

现有配置信息

Docker启动命令

sudo docker run --detach --hostname MY_URL.com --publish 4433:443 --publish 8080:80 --publish 2222:22 --name gitlab --volume /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

Nginx反向代理配置

server {
  server_name MY_URL.com;
  location / {
    proxy_pass http://127.0.0.1:8080/;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwardedd_for;
    proxy_set_header X-Forwarded_Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
  }
  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/MY_URL.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/MY_URL.com/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
  if ($host = MY_URL.com) {
    return 301 https://$host$request_uri;
  } # managed by Certbot

  listen 80;
  server_name MY_URL.com;
    return 404; # managed by Certbot
}

GitLab配置修改

编辑/data/gitlab/config/gitlab.rb,添加:

external_url 'https://MY_URL.com'

执行重新配置命令:

sudo docker exec -it gitlab gitlab-ctl reconfigure

错误原因分析

  1. Nginx配置拼写错误:X-Forwarded-For头的变量拼写错误($proxy_add_x_forwardedd_for多了一个d),导致GitLab无法正确获取客户端真实IP及转发协议信息。
  2. GitLab内部Nginx冲突:设置external_url为HTTPS后,GitLab内置Nginx默认会强制跳转至HTTPS,但反向代理已将HTTPS请求转换为HTTP转发给容器内的80端口,形成重定向循环。

解决步骤

1. 修复Nginx配置错误

将Nginx配置中的proxy_set_header X-Forwarded-For $proxy_add_x_forwardedd_for;修改为:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

2. 完善GitLab反向代理配置

在/data/gitlab/config/gitlab.rb中添加以下配置,告知GitLab运行在反向代理之后,信任转发头并关闭内部HTTPS监听:

external_url 'https://MY_URL.com'
# 让GitLab内置Nginx监听80端口(HTTP),关闭HTTPS监听
nginx['listen_port'] = 80
nginx['listen_https'] = false
# 配置转发头,确认外部协议为HTTPS
nginx['proxy_set_headers'] = {
  "X-Forwarded-Proto" => "https",
  "X-Forwarded-Ssl" => "on"
}
# 信任反向代理的IP(此处为本地127.0.0.1,若反向代理在其他机器需修改)
gitlab_rails['trusted_proxies'] = ['127.0.0.1']

3. 重新配置GitLab并重启服务

执行GitLab重新配置命令:

sudo docker exec -it gitlab gitlab-ctl reconfigure

重启Nginx生效配置:

sudo systemctl restart nginx

验证结果

完成上述配置后,访问https://MY_URL.com可正常进入GitLab,仓库克隆链接将显示为HTTPS地址,CI任务使用HTTPS地址时的认证错误也会解决。

内容的提问来源于stack exchange,提问作者djcaesar9114

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:36:22