![使用 authz 时 SVN 父列表返回 403](https://linux22.com/image/530560/%E4%BD%BF%E7%94%A8%20authz%20%E6%97%B6%20SVN%20%E7%88%B6%E5%88%97%E8%A1%A8%E8%BF%94%E5%9B%9E%20403.png)
我在 svn.example.com 设置了一个 svn
我已将 SVNParentPath 设置为列出目录中的所有存储库。
当我启用我的 AuthzSVNAccessFile 时,列表页面返回 403,而我可以直接通过 svn.example.com/repo 名称正确访问存储库。
Apache 会议:
<VirtualHost *:80>
ServerName svn.example.com
DocumentRoot /var/www/svn
<Location />
DAV svn
AuthType Basic
AuthName "svn.example.com"
AuthUserFile /etc/apache2/svn/users.passwd
AuthzSVNAccessFile /etc/apache2/svn/authz
SVNParentPath /var/svn
SVNListParentPath on
Require valid-user
</Location>
</VirtualHost>
授权文件:
[groups]
admin = user1. user2, user3
[/]
@admin = rw
这是我在错误日志中看到的内容;
The URI does not contain the name of a repository. [403, #190001]
Could not fetch resource information. [500, #0]
Could not open the requested SVN filesystem [500, #2]
Could not open the requested SVN filesystem [500, #2]
访问日志
svn.example.com:80 *myIP* - user1 [18/Nov/2010:13:56:53 +0000] "GET / HTTP/1.1" 403 274 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7"
答案1
经过进一步审查,我同意 iiegn 的回答。我能够通过添加尾部斜杠和不带斜杠的别名(如文章所建议的那样)来消除 SVN 1.6.13 的问题。
先前的回应:
我在 StackOverflow 上找到了这个问题的答案https://stackoverflow.com/questions/488778/how-do-i-list-all-repositories-with-the-svnparentpath-directive-on-apachesvn,并补充称:
SVNListParentPath On
这与http://svnbook.red-bean.com/en/1.5/svn.ref.mod_dav_svn.conf.html,其中指出:
SVNListParentPath 开|关
设置为 On 时,允许 SVNParentPath 的 GET,从而列出该路径下的所有存储库。默认设置为 Off。
这应该可以解决 403 问题。
答案2
...您是否尝试过使用<Location /svn/>
带有尾随 slah! 的 - :http://www.svnforum.org/2017/viewtopic.php?t=6443
人们似乎已经解决了“非根目录情况”的问题。
...那么,至少,你知道该往哪里进一步看(mod-rewrite……?)。
答案3
AuthzSVNAnonymous On
AuthzSVNNoAuthWhenAnonymousAllowed On
Satisfy Any
首先,您需要该Satisfy Any
指令,如果运行组合的 open / auth repo,您还需要 Anonymous 行(即,我有一些包含开源和闭源的区域)。
正如我在此博客中关于升级所写:http://www.saiweb.co.uk/linux/mod_authz_svn-mod_dav_svn-prompting-for-password
验证 SVNParentPath /var/svn 路径是否存在于 /var/svn 中,并且 apache 可以使用它进行访问和写入,很有可能你把它留给了 root:rootchown -R apache:apache /var/svn
答案4
我遇到了同样的问题,并找到了以下解决方法。主要想法是不将“AuthzSVNAccessFile”应用于根目录,而是应用于其余目录。在 apache2.2(Ubuntu Server 12.04)中对我有用。
<VirtualHost *:80>
...
<Location />
...
</Location>
<Location /.+>
AuthzSVNAccessFile /path/to/the/access/file
</Location>
</VirtualHost>
更新(完整配置):
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName svn.company.lan
<Location />
# Enable Subversion
DAV svn
# Directory containing all repository for this path
SVNListParentPath on
SVNParentPath /opt/subversion
# LDAP Authentication & Authorization is final; do not check other databases
AuthzLDAPAuthoritative on
AuthBasicProvider ldap
# Do basic password authentication in the clear
AuthType Basic
# The name of the protected area or "realm"
AuthName "Subversion Repository"
# The LDAP query URL
# Format: scheme://host:port/basedn?attribute?scope?filter
# The URL below will search for all objects recursively below the basedn
# and validate against the sAMAccountName attribute
AuthLDAPURL "ldap://dc1.company.com/dc=serv,dc=company,dc=com?sAMAccountName?sub"
AuthLDAPBindDN "CN=svn1user,OU=ou1,DC=company,DC=com"
AuthLDAPBindPassword "PASS"
# Require authentication for this Location
Require valid-user
</Location>
# <LocationMatch /.+> is a really dirty trick to make listing of repositories work (http://d.hatena.ne.jp/shimonoakio/20080130/1201686016)
<LocationMatch /.+>
AuthzSVNAccessFile /opt/subversion/subversion.perm
</LocationMatch>
</VirtualHost>