我正试图在一台使用智能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
时没有针对环境变量的"白名单"配置旋钮,因此正确的方法是:
-
创建一个包含实际
git-http-backend
的脚本。看来你已经有了。
-
使用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
行为的更多详细信息,请参阅此处。