Назад | Перейти на главную страницу

Apache DAV по адресу `/` с обычным хостингом в `/ foo` - как?

Если я не смогу иметь конфигурацию, в которой я обслуживаю репозитории SVN с SVNParentPath в <Location /> а затем переопределить DAV и разместить обычные файлы в другом месте <Location /foo>? Я хочу разместить свои файлы XSLT в одном поддомене и по-прежнему размещать репозитории в корневом каталоге. Конечно, если бы у меня было репо с именем foo, оно было бы недоступно, и это нормально.

<VirtualHost *:80>
    ...
    #Host XSLT files here
    <Location /foo>
        DAV Off
    </Location>

    #Host my repos relative to root, such as /my_repo/
    <Location />
        DAV svn     
        SVNParentPath "myrepos"
        SVNListParentPath on
        SVNIndexXSLT "/foo/my.xsl"
        ...
    </Location>
</VirtualHost>

Но DAV SVN все еще ищет репо:

<?xml version="1.0" encoding="utf-8"?>
<D:error xmlns:D="DAV:" xmlns:m="http://apache.org/dav/xmlns" xmlns:C="svn:">
<C:error/>
<m:human-readable errcode="720003">
Could not open the requested SVN filesystem
</m:human-readable>
</D:error>

Изменить: я немного прочитал о перезаписи мода, и, насколько я понимаю, целевой путь правила перезаписи может быть только локальным, если вы не используете перенаправление [R]. Это, например, работает, создает перенаправление (HTTP 302):

RewriteEngine On
RewriteRule ^/foo/(.*)$ http://someotherhost/foo/$1 [R]

Однако он по-прежнему не работает с SVNIndexXSLT. Вероятно, потому что он не следует перенаправлениям.

Просто разместите svn на svn.example.com и оставьте / для обычного http.

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

Вы можете попробовать mod_rewriting выйти из этого. Если бы у вас был

RewriteRule ^/foo/(.*)$ /some/local/directory/$1 [L]

Теоретически мощь уклоняться от DAV, поскольку без флага PT он не должен передавать запрос любому другому модулю. По крайней мере, стоит попробовать.

Если это не сработает, обязательно ответьте на это, чтобы кто-нибудь, пытающийся это сделать, увидел, что это невозможно;)

Вы когда-нибудь придумали ответ на это? Я сейчас пробую точно такую ​​же конфигурацию и сталкиваюсь с той же проблемой, что и вы.

Как бы то ни было, для вас есть половина решения - при условии, что возможность автоматического перечисления репозиториев (с включенным SVNListParentPath) для вас не критична.

Вместо этого вы можете использовать директиву SVNPath - таким образом, у вас будет что-то вроде:

<Location />
     SVNIndexXSLT "/repos-web/view/repos.xsl"
     # Other common options, such as Auth options can go here
</Location>

<Location /repository1>
     SVNPath /var/lib/svn/repositories/repo1
     DAV svn
</Location>

<Location /repository2>
     SVNPath /var/lib/svn/repositories/repo2
     DAV svn
</Location>

<Location /repository3>
     SVNPath /var/lib/svn/repositories/repo3
     DAV svn
</Location>

Очевидно, что если вы используете установку, в которой вы регулярно создаете новые репозитории (подход «репозиторий для каждого проекта»), то это не будет вам очень привлекательно. Но это годится для небольшого фиксированного количества репозиториев.

Затем вы можете поместить жестко запрограммированный index.htm в корень документа apache, если хотите, чтобы что-то удобное для пользователя появилось в http://svn.yourdomain.com/

Я протестировал этот подход, и он работает. Жалко о потере автоматически созданного списка репозиториев (и необходимости отображать каждый репозиторий в httpd.conf)