Динамические репозитории Subversion через поддомен (в Apache) - PullRequest
3 голосов
/ 15 декабря 2010

Я пытаюсь настроить перевод субдомена в репозиторий в Apache. Пример:

foobars.domain.com -> /server/svnrepos/foobars

Я пытался сделать это с mod_rewrite :

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
RewriteRule ^/svn(.*) /svn/%2$1 [PT]

Однако это вызывает проблемы с основными операциями SVN; 'checkout' вызывает эту красивую вещь:

$ svn co http://foobars.domain.com/svn
svn: '/svn/foobars/!svn/vcc/default' path not found

У меня нет никаких ограничений с точки зрения настройки сервера (мои машины, операционная система и т. Д.). Есть ли способ обработать этот перевод Apache? Я смотрел на массовые виртуальные хосты, но не вижу способа расширить концепцию до мест расположения DAV (хотелось бы, чтобы был VirtualSvnPath ...). Способ mod_dav_svn заставляет вас либо 1) явно определять путь репо svn, либо 2) определять родителя, он очень ограничен.

Возможно, 'SVNSpecialURI' может быть полезен, хотя я не могу найти какую-либо документацию по нему ...

Предполагая, что моей конечной целью является сопоставление субдомена с SVNPath, каковы мои варианты?

Мой текущий конф в качестве ссылки:

<VirtualHost *:80 *:443>
    ServerAdmin admin@domain.com
    DocumentRoot "/server/www"
    ServerName domain.com
    ServerAlias *.domain.com www.domain.com domain.com
    ErrorLog logs/domain-error_log
    CustomLog logs/domain-access_log common

    DirectorySlash Off

    RewriteLogLevel 9
    RewriteLog /server/log/apache-rewrite.log

    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
    RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
    RewriteRule ^/svn$ /svn/ [QSA]

    RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
    RewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.domain\.com$ [NC]
    RewriteRule ^/svn(.*) /svn/%2$1 [PT]

<Location /svn>
    DAV svn
    SVNParentPath /server/svn
</Location>

1 Ответ

4 голосов
/ 17 декабря 2010

В интересах Open Source (ууу!) Я выложу свое решение. Я не нашел встроенного решения своей проблемы, поэтому я потратил несколько часов на исходники mod_dav_svn.so и предложил этот патч:

Index: subversion/mod_dav_svn/mod_dav_svn.c
===================================================================
--- subversion/mod_dav_svn/mod_dav_svn.c        (revision 1049733)
+++ subversion/mod_dav_svn/mod_dav_svn.c        (working copy)
@@ -426,9 +426,14 @@
dav_svn__get_fs_parent_path(request_rec *r)
 {
   dir_conf_t *conf;
+  char *tokens, *subdomain, *last_str;

   conf = ap_get_module_config(r->per_dir_config, &dav_svn_module);
-  return conf->fs_parent_path;
+
+  tokens = apr_pstrdup(r->pool, r->hostname);   // copy hostname
+  subdomain = apr_strtok(tokens, ".", &last_str);
+
+  return (const char *) apr_pstrcat(r->pool, conf->fs_parent_path, "/", subdomain, NULL);
 }

По сути, это захватывает текущее имя хоста (из ожидающего запроса 'request_rec'), вырезает первый токен (поддомен) и объединяет его с соответствующим SVNParentPath (conf-> fs_parent_path) и вуаля! Все работает как надо. Вот мой конфиг сервера (обратите внимание, как это просто сейчас):

<VirtualHost *:80 *:443>
    ServerAdmin admin@domain.com
    DocumentRoot "/server/www"
    ServerName domain.com
    ServerAlias *.domain.com www.domain.com domain.com
    ErrorLog logs/domain-error_log
    CustomLog logs/domain-access_log common

    <Location /svn>
        DAV svn
        SVNParentPath /server/svn
        SVNListParentPath on
    </Location>
</VirtualHost>

Примечания:

Я надеюсь, что я правильно использовал функции apr_ *, если есть какие-то предостережения, я хотел бы получить отзыв:)

Проверено на Centos с последним деревом mod_dav_svn.

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