![是否可以从 apache LocationMatch 指令中获取匹配的正则表达式?](https://linux22.com/image/594673/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BB%8E%20apache%20LocationMatch%20%E6%8C%87%E4%BB%A4%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%8C%B9%E9%85%8D%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%9F.png)
我想知道以下代码是否应该起作用:
<LocationMatch "/(.*)([/])?(.*)">
Order allow,deny
Allow from all
AuthType Basic
AuthName "Git"
AuthUserFile /git/.htpasswd
AuthGroupFile /git/.htgroup
Require group $1
</LocationMatch>
我试图通过这个来实现的是要求基于第一个正则表达式变量的组。因此,如果用户访问,http://localhost/a-repository-name
他必须属于该组a-repository-name
才能打开 URL。
由于某种原因,我无法使此代码运行,并且 apache 返回:
Authorization of user **** to access /a-repository-name failed, reason: user is not part of the 'require'ed group(s).
我猜它与 处的正确变量不匹配Require group $1
。
这是正确的做法吗,还是我遗漏了什么?
答案1
LocationMatch
不支持反向引用,在 2.4.8 之前的版本中您无法这样做。
答案2
根据Apache 文档现在支持...
从 2.4.8 开始,命名组和反向引用会被捕获并写入环境,其相应名称以“MATCH_”为前缀,且采用大写字母。这样就可以在表达式和模块(如 mod_rewrite)中引用 URL 元素。为了避免混淆,编号(未命名)的反向引用会被忽略。请改用命名组。
<LocationMatch "^/combined/(?<sitename>[^/]+)">
require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</LocationMatch>