Как включить mod_dav_svn в корневой каталог именованного виртуального хоста?
Возможно ли это? У меня были проблемы с клиентами SVN, которые не могли получить доступ к репозиторию со следующим сообщением об ошибке:
Репозиторий постоянно перемещается в 'http://svn.example.com/test/'; пожалуйста, переместите
Если я добавил '/' в конец пути, к которому я пытался получить доступ, он просто отключает его и показывает то же сообщение об ошибке. Мой файл конфигурации выглядит так:
<VirtualHost *>
ServerName svn.example.com
# Normal VirtualHost stuff here
<Location /svn>
# Uncomment this to enable the repository
DAV svn
SVNParentPath /some/path/to/repositories
# Setup mod_authz_svn, etc, etc here
</Location>
</VirtualHost>
Примечание. Это работает. Но если я изменил местоположение на /
, он перестанет работать снова с ошибкой выше. Можно ли использовать корневой каталог, или я чего-то здесь не вижу? Firefox отображает список репозиториев в порядке, когда вы обслуживаете репозитории из корня.
Как заметил кто-то другой, это только кажется проблемой внутри именованных виртуальных хостов... У кого-нибудь есть какие-то умные идеи?
Ответы
Ответ 1
Проблема в том, что вы используете корень документа также как корень репозитория (я не обвиняю вас, это должно работать, но это не так).
Попробуйте указать директивы DocumentRoot
и SVNParentPath
в разные физические области, поэтому полученный файл конфигурации должен выглядеть так (сокращенно):
<VirtualHost *:80>
DocumentRoot /home/svn.example.com/docroot
<Location />
SVNParentPath /home/svn.example.com/svnroot
SVNListParentPath on
</Location>
</VirtualHost>
Кроме того, как говорит @Nigel Jewell, удалите этот блок Rewrite для разумности.
Ответ 2
Продолжая комментарии к моему предыдущему ответу, я также пробовал использовать VirtualHost:
<VirtualHost 127.0.0.1:80>
<Location />
DAV svn
SVNPath /repository
AuthType Basic
AuthName "Repository authentication"
AuthUserFile /repository/.svn-auth
AuthzSVNAccessFile /repository/.svn-access
Satisfy All
Require valid-user
</Location>
</VirtualHost>
и он работает, я могу просматривать репозиторий с помощью firefox и получать доступ к нему с помощью клиента командной строки svn.
Ответ 3
Обнаружено это в файле /etc/apache 2/conf.d/subversion.conf(необходимо сопоставить документы с ошибками по умолчанию):
<VirtualHost *>
ServerName svn.example.com
ErrorLog /var/log/apache2/svn.example.com-error_log
TransferLog /var/log/apache2/svn.example.com-access_log
#
# Do not set DocumentRoot. It is not needed here and just causes trouble.
#
# Map the error documents back to their defaults.
# Otherwise mod_dav_svn tries to find a "error" repository.
#
ErrorDocument 400 default
ErrorDocument 401 default
ErrorDocument 403 default
ErrorDocument 404 default
ErrorDocument 405 default
ErrorDocument 408 default
ErrorDocument 410 default
ErrorDocument 411 default
ErrorDocument 412 default
ErrorDocument 413 default
ErrorDocument 414 default
ErrorDocument 415 default
ErrorDocument 500 default
ErrorDocument 501 default
ErrorDocument 502 default
ErrorDocument 503 default
#
<Location />
...
</Location>
После этого все началось, как ожидалось.
Ответ 4
В итоге я успешно использовал mod_rewrite, чтобы переписать весь доступ к корневому каталогу в /svn
, следовательно, получить доступ к репозиториям из /repository_name
. Для справки, это конфигурация, в которую я закончил:
# Rewrite / into /svn to avoid errors that seem to occur when using the root
# for repositories.
RewriteEngine On
# Subdirectories that SHOULD be accessed directly, ie. trac
# /svn should be here to avoid redirect loops
RewriteCond %{REQUEST_URI} !^/(trac|svn)/
RewriteRule ^/(.*)$ /svn/$1 [PT]
Ответ 5
Хорошо, я думаю, мы нашли, кто виноват: named virtual hosts:)
В этой конфигурации:
<VirtualHost dave.test>
<Location />
DAV svn
SVNPath /repository
AuthType Basic
AuthName "Repository authentication"
AuthUserFile /repository/.svn-auth
AuthzSVNAccessFile /repository/.svn-access
Satisfy All
Require valid-user
</Location>
</VirtualHost>
когда я запускаю команду svn ls http://dave.test
, я получил эту ошибку:
svn: Server sent unexpected return value (405 Method Not Allowed) in response to
PROPFIND request for '/'
По-видимому, существует проблема, когда вы пытаетесь включить mod_dav_svn в корневой каталог именованного виртуального хоста...
Ответ 6
This is working for me:
<Location />
DAV svn
SVNPath /repository
AuthType Basic
AuthName "Repository authentication"
AuthUserFile /repository/.svn-auth
AuthzSVNAccessFile /repository/.svn-access
Satisfy All
Require valid-user
</Location>
Указание браузера на http://127.0.0.1 показывает мне содержимое репозитория.
Ответ 7
Спасибо за это, наконец, получил его работу с VirtualHost из-за ваших комментариев.
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName svn.example.com
ServerAlias svn
DocumentRoot /home/svn.example.com/public_html
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/svn$
RewriteRule .* /svn/ [PT]
RewriteCond %{REQUEST_URI} !^/svn/
RewriteRule ^/(.*)$ /svn/$1 [PT]
<Location /svn>
DAV svn
SVNParentPath /home/svn.example.com/public_html
SVNListParentPath on
</Location>
<LocationMatch /svn/.+>
AuthzSVNAccessFile /home/svn.example.com/support/access.cfg
AuthType Basic
AuthName "Subversion"
AuthUserFile /home/svn.example.com/.htpasswd
Require valid-user
</LocationMatch>
</VirtualHost>
Как показано, я обнаружил, что вы, вероятно, захотите добавить:
RewriteCond %{REQUEST_URI} ^/svn$
RewriteRule .* /svn/ [PT]
Чтобы уловить http://svn.example.com/svn без окончания /.
Nige.
Ответ 8
DocumentRoot "/usr/local/apache/htdocs/ForSvn" Имя_сервера xxx.xxx ServerAdmin xxx ErrorLog "/usr/local/apache/logs/xxx-error_log" TransferLog "/usr/local/apache/logs/xxx-access_log"
ReWriteEngine On
RewriteCond %{REQUEST_URI} ^/svn$
RewriteRule .* /svn/ [PT]
<Location /svn>
DAV svn
SVNParentPath /svn/repos
SVNListParentPath on
# Limit write permission to list of valid users.
<LimitExcept GET PROPFIND OPTIONS REPORT>
AuthType Basic
AuthName "Subversion"
AuthUserFile /svn/authfiles/svn-htpasswd
AuthzSVNAccessFile /svn/authfiles/svn-access.conf
Require valid-user
</LimitExcept>
</Location>
<LocationMatch /svn/myProject/>
AuthType Basic
AuthName "Subversion (private)"
AuthUserFile /svn/authfiles/svn-htpasswd
AuthzSVNAccessFile /svn/authfiles/svn-access.conf
Require user user1 user2 user3...
</LocationMatch>
и отлично работает со мной. Спасибо за это.