使用Traefik反向代理时Gitea登录页面重定向异常问题
解决Gitea通过Traefik子路径代理时Git Push重定向丢失前缀的问题
问题描述
使用Traefik作为反向代理、Gitea作为Git服务器,按配置完成后,可通过/gitea路径前缀正常访问Gitea服务、克隆仓库,但执行git push -u origin main命令时,系统会重定向至http://{Host}/login/oauth/authorize,而非预期的http://{Host}/gitea/login/oauth/authorize,手动添加/gitea前缀后可正常使用,需修复该重定向异常。
现有配置
docker-compose.yml
... services: traefik: image: docker://traefik:latest container_name: traefik networks: - network command: - "--api.insecure=true" - "--providers.docker=true" ports: - "80:80" - "8080:8080" volumes: - "/run/user/1000/podman/podman.sock:/var/run/docker.sock:z" gitea: image: docker://gitea/gitea:latest container_name: gitea environment: - USER_UID=1000 - USER_GID=1000 volumes: - ~/gitea:/data - ~/gitea/config:/data/gitea/conf - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro labels: - "traefik.http.routers.gitea.rule=PathPrefix(`/gitea`)" - "traefik.http.services.gitea.loadbalancer.server.port=3000" - "traefik.http.middlewares.gitea-stripprefix.stripprefix.prefixes=/gitea" - "traefik.http.routers.gitea.middlewares=gitea-stripprefix" ports: - "10880:3000" - "10022:22" networks: - network depends_on: - mysql
Gitea配置文件
RUN_USER = git WORK_PATH = /data/gitea RUN_MODE = prod [repository] ROOT = /data/gitea/data/gitea-repositories [server] SSH_DOMAIN = raspberrypi DOMAIN = raspberrypi HTTP_PORT = 3000 ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s/gitea/ PROTOCOL = http
解决步骤
问题核心是Gitea未正确识别反向代理传递的子路径前缀,导致生成的OAuth重定向URL缺失/gitea。需通过以下调整修复:
更新Traefik的Gitea路由配置
在Gitea服务的Traefik标签中新增一个中间件,给请求添加X-Forwarded-Prefix头,告知Gitea其运行的子路径前缀。修改后的标签如下:labels: - "traefik.http.routers.gitea.rule=PathPrefix(`/gitea`)" - "traefik.http.services.gitea.loadbalancer.server.port=3000" - "traefik.http.middlewares.gitea-stripprefix.stripprefix.prefixes=/gitea" - "traefik.http.middlewares.gitea-addprefix.headers.customrequestheaders.X-Forwarded-Prefix=/gitea" - "traefik.http.routers.gitea.middlewares=gitea-stripprefix,gitea-addprefix"确认Gitea的ROOT_URL配置
确保Gitea配置文件中的ROOT_URL已正确包含子路径,当前配置已满足要求:[server] ROOT_URL = http://raspberrypi/gitea/重启相关容器
应用配置修改后,重启Traefik和Gitea容器:docker-compose restart traefik gitea
原理说明
Traefik的stripprefix中间件会移除/gitea前缀后再转发请求给Gitea,但Gitea默认不知道这个前缀,因此生成的URL会缺失该路径。通过添加X-Forwarded-Prefix头,Gitea能正确识别子路径,从而生成包含/gitea前缀的重定向URL。
内容的提问来源于stack exchange,提问作者Oleksandr
相关产品推荐
相关产品推荐

