Как включить 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>

и отлично работает со мной. Спасибо за это.