Динамические подрывные репо с помощью субдоменов (в апаче)
-
10-10-2019 - |
Вопрос
Я пытаюсь настроить перевод поддона к переосмыслению в 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; «Проверка» вызывает эту красивую вещь:
$ svn co http://foobars.domain.com/svn
svn: '/svn/foobars/!svn/vcc/default' path not found
У меня нет никаких ограничений с точки зрения настройки сервера (мои машины, ОС и т. Д.). Есть ли способ получить этот перевод Apache? Я смотрел на массовые виртуальные хосты, но я не вижу способа расширить концепцию в местоположениях DAV (я бы хотел, чтобы был виртуальный размер ...). То, как MOD_DAV_SVN заставляет вас либо 1) явно определить свой путь репо SVN, или 2) определить родитель, очень ограничен.
Возможно, «svnspecialuri» может быть полезен, хотя я не могу найти никакой документации на ней ...
Предполагая, что моя конечная цель - карта субдомен Каковы мои варианты?
Мой текущий конфуз как ссылка:
<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>
Решение
В интересах открытого исходного кода (ура!) Я опубликую свое решение. Я не нашел встроенного решения моей проблемы, поэтому я провел несколько часов на источниках 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.