git-recieve-pack 的 loacationmatch 不起作用

git-recieve-pack 的 loacationmatch 不起作用

我正在尝试在我的 apache2 服务器上设置 git-http-backend。目前,它与 suexec 和包装器以及所有内容一起工作,但没有限制。我可以拉取和推送。

现在我想包含限制推送权限的部分:

<LocationMatch "^/git/.*/git-receive-pack$">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /var/www/vhosts/librepdm.alitecs.de/users
    Require user alexander
</LocationMatch>

用户文件已就位并已填充。以下是我的 apache access_log:

93.95.132.202 - - [28/Mar/2012:15:23:18 +0200] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 403 357 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - - [28/Mar/2012:15:23:18 +0200] "GET /git/test.git/info/refs HTTP/1.1" 200 331 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - - [28/Mar/2012:15:23:18 +0200] "GET /git/test.git/HEAD HTTP/1.1" 200 341 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - - [28/Mar/2012:15:23:22 +0200] "PROPFIND /git/test.git/ HTTP/1.1" 405 536 "-" "git/1.7.8.msysgit.0"

这是我的错误日志

[Wed Mar 28 15:23:18 2012] [error] [client 93.95.132.202] Service not enabled: 'receive-pack'

好的,这个提示很好,如果我在 repo 中启用 http.recievepack,它就可以工作,但如果我不在 url 中告知凭据,我会再次收到错误,而且我不想激活它。所以我尝试了其他方法。我编辑了 LocationMatch,如下所示:

<LocationMatch "^/git/.*$">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /var/www/vhosts/librepdm.alitecs.de/users
    Require user alexander
</LocationMatch>

我删除了正则表达式中的“git-recieve-pack”。令人惊讶的是,现在所有内容都受到保护,并且还可以拉取,但如果我不在 URL 中告诉我的凭据,TortoiseGIT 会要求我输入用户和密码,并且无需将 http.recievepack 设置为 true 即可进行推送。Apache 日志略有不同:

93.95.132.202 - - [28/Mar/2012:15:46:16 +0200] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 401 691 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - - [28/Mar/2012:15:46:20 +0200] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 401 691 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - alexander [28/Mar/2012:15:46:20 +0200] "GET /git/test.git/info/refs?service=git-receive-pack HTTP/1.1" 200 466 "-" "git/1.7.8.msysgit.0"
93.95.132.202 - alexander [28/Mar/2012:15:46:21 +0200] "POST /git/test.git/git-receive-pack HTTP/1.1" 200 380 "-" "git/1.7.8.msysgit.0"

如果我将其与第一个进行比较,第一个访问调用是不同的。在第一部分中,它显示 403 - 未经授权,但我没有被要求提供凭据,并且它无助于在 URL 中传递。第二个显示 401,这很好。

所以我的问题是,为什么如果我保护整个位置,登录会起作用,而如果我只想保护推送,登录就不起作用? get 命令是相同的,但不知何故没有要求我登录。恕我直言,这不是 git 或 TortoiseGT 或 mysysgit 的问题,而是 apache 的问题……

问候,亚历山大

答案1

我像这样更新了我的配置:

  <Location /public >

 SetEnv CGIT_CONFIG /srv/git/etc/cgitrc-public
 SetHandler cgi-script
 Options +ExecCGI

 RewriteCond %{QUERY_STRING} service=git-receive-pack
 RewriteRule .* - [E=AUTHREQUIRED:yes]

 AuthzLDAPAuthoritative Off
 AuthLDAPURL "ldap://myldap.mycorp.com/dc=mycorp,dc=com?mailNickname"
 AuthLDAPBindDN "ldapaccount"
 AuthLDAPBindPassword password
 AuthType Basic
 AuthName "MyCorp LDAP Protected Area"
 require valid-user

答案2

查看请求

/git/test.git/info/refs?service=git-receive-pack

它不再匹配,<LocationMatch "^/git/.*/git-receive-pack$">因为service=git-receive-pack是参数而不是位置(URI)

相关内容