![git-recieve-pack 的 loacationmatch 不起作用](https://linux22.com/image/580029/git-recieve-pack%20%E7%9A%84%20loacationmatch%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我正在尝试在我的 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)