未找到具有智能HTTP和suexec:repository的Git



我正试图在一台使用智能HTTP的服务器上安装我自己的Git存储库。

它可以在没有suexec的虚拟服务器上工作,但在我的启用了suexec的生产服务器上不工作。当我尝试克隆或推送时,它会说:

致命:存储库'http://domain.tld/git/project/'未找到

Apache配置如下:

<VirtualHost *:80>
    Options -Indexes +ExecCGI
    ServerAdmin user@domain.tld
    DocumentRoot /var/www/domain.tld
    ServerName domain.tld
    Alias /fcgi-bin/ /var/www/domain.tld/fcgi-bin/
    SuexecUserGroup domainuser domainuser
    ########## GIT ##########
    SetEnv GIT_PROJECT_ROOT /var/www/git/git_domain
    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
    ScriptAlias /git/ /var/www/git/git_domain/git-http-backend/
    Alias /git /var/www/git/git_domain
    <Directory /usr/lib/git-core>
        Options +ExecCGI +SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
    </Directory>
    <Directory /var/www/git/git_domain>
        Options -Indexes -SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
    </Directory>
    ########## PROJECT DIRS HTPASS ##########
        <LocationMatch "^/git/project1/.*$">
#            DAV on
            AuthType Basic
            AuthName "project1"
            AuthUserFile /var/www/git/gitpass/domain/project1
            Require valid-user
        </LocationMatch>
    ########## /PROJECT DIRS HTPASS ##########
    ########## /GIT ##########

如果我禁用

ScriptAlias/git//var/www/git/git_domain/git http backend/

我可以克隆,但可以推送,因为在这种情况下它可以与DAV一起工作。

我想我把所有文件的所有者和权限都改成了正确的值(domainuser,755),suexec在日志中没有抱怨任何事情。

有人能告诉我哪里做错了吗?

提前谢谢。

这很简单:mod_suexec在运行目标程序之前擦除所有环境变量,因此所有SetEnv指令都没有效果。

不幸的是,我上次检查(面临同样的问题)mod_suexec时没有针对环境变量的"白名单"配置旋钮,因此正确的方法是:

  1. 创建一个包含实际git-http-backend的脚本。

    看来你已经有了。

  2. 使用shell的export内建函数重新格式化所有相关的SetEnv指令。

    也就是说,

    SetEnv GIT_PROJECT_ROOT /var/www/git/git_domain
    

    因为

    export GIT_PROJECT_ROOT=/var/www/git/git_domain
    

    在脚本代码中。

如果您需要相同的虚拟主机配置文件来在"正常"模式下和mod_suexec下工作,请在SetEnv指令的块旁边对这个怪癖发表大量评论,建议下一个人将它们与包装脚本中的任何内容保持同步。

有关mod_suexec行为的更多详细信息,请参阅此处。

最新更新