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

Docker化Git服务器Apache HTTP/HTTPS基础认证失效求助

Git服务器HTTP认证失效问题修复

问题现象

使用提供的Dockerfile构建集成Apache与SSH的Git服务器容器后,访问http://localhost:8080/git/test.git时未弹出基础认证窗口,无需输入账号密码即可执行git clone操作克隆仓库,配置的Basic认证完全失效。

核心原因

  1. 认证规则作用范围错误:当前Apache配置将认证规则放在/var/www/git的<Directory>块中,但Git HTTP请求是通过ScriptAlias映射到/usr/lib/git-core/git-http-backend/处理,而该目录的规则是Require all granted,直接绕过了认证。
  2. 全局匿名读取开关开启:配置中的SetEnv GIT_HTTP_EXPORT_ALL会让Git允许所有仓库的匿名读取访问,直接跳过认证检查。

修复步骤

1. 修改Apache虚拟主机配置

替换Dockerfile中生成/etc/apache2/sites-available/000-default.conf的echo内容,将认证规则移至<Location>块(针对Git请求路径),并移除GIT_HTTP_EXPORT_ALL环境变量:

<VirtualHost *:80>
    SetEnv GIT_PROJECT_ROOT /var/www/git
    ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

    <Location /git/>
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /auth/.htpasswd
        Require valid-user

        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        SetEnv GIT_HTTP_BACKEND "/usr/lib/git-core/git-http-backend"
    </Location>

    <Directory "/usr/lib/git-core">
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

    SetEnv GIT_PROJECT_ROOT /var/www/git
    ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

    <Location /git/>
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /auth/.htpasswd
        Require valid-user

        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        SetEnv GIT_HTTP_BACKEND "/usr/lib/git-core/git-http-backend"
    </Location>

    <Directory "/usr/lib/git-core">
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Require all granted
    </Directory>
</VirtualHost>

2. 可选:细化仓库权限(区分读写)

如果需要允许匿名只读、认证可写,可保留GIT_HTTP_EXPORT_ALL,但在<Location>块中针对推送请求增加认证:

<Location /git/>
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /auth/.htpasswd

    # 匿名允许读取,推送需要认证
    <LimitExcept GET HEAD OPTIONS>
        Require valid-user
    </LimitExcept>

    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    SetEnv GIT_HTTP_BACKEND "/usr/lib/git-core/git-http-backend"
</Location>

同时在Dockerfile中添加命令开启仓库推送权限:

RUN git config --file /var/www/git/test.git/config http.receivepack true

3. 重新构建并启动容器

docker build -t git-server .
docker run -d -p 8080:80 -p 2222:22 -p 8443:443 git-server

验证效果

执行clone命令,此时会提示输入账号密码:

git clone http://localhost:8080/git/test.git

输入root/root即可完成克隆;若输入错误密码则会被拒绝访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:19:56