Как включить mod_dav_svn в корневом каталоге именованного виртуального хоста? - PullRequest
14 голосов
/ 05 ноября 2008

Возможно ли это? У меня были проблемы с клиентами 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>

Примечание: это работает. Но если я изменил Location на /, он перестал работать снова с ошибкой выше. Можно ли использовать корневой каталог, или я что-то здесь упускаю? Firefox отображает список репозитория в порядке при обслуживании репозиториев из корня.

Как заметил кто-то другой, это только проблема внутри именованных виртуальных хостов ... У кого-нибудь есть какие-нибудь умные идеи, почему?

Ответы [ 8 ]

6 голосов
/ 17 декабря 2008

Проблема в том, что вы используете корень документа также в качестве корня хранилища (я не виню вас, это должно просто работать, но это не так).

Попробуйте указать директивы 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 голосов
/ 22 декабря 2009

Найдено в /etc/apache2/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>

После того, как я это сделал, все заработало как положено.

2 голосов
/ 06 ноября 2008

Продолжая от комментариев к моему предыдущему ответу, я попробовал также с 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.

1 голос
/ 06 ноября 2008

Хорошо, я думаю, мы нашли, кого винить: назвали виртуальные хосты:)

При такой конфигурации:

<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 в корневом каталоге именованного виртуального хоста ...

1 голос
/ 06 ноября 2008

В итоге я успешно использовал 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]
0 голосов
/ 23 декабря 2008

DocumentRoot "/ usr / local / apache / htdocs / ForSvn" ServerName 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>

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

0 голосов
/ 17 декабря 2008

Спасибо за это, наконец-то, благодаря вашим комментариям, он начал работать с VirtualHost.

<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    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.

0 голосов
/ 06 ноября 2008
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 отображается содержимое хранилища.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...