2010-12-15 77 views
3

J'essaie de configurer une traduction de sous-domaine à référentiel dans Apache. Exemple:Repos dynamique de subversion via des sous-domaines (dans Apache)

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

J'ai essayé de réaliser ce but avec mod_rewrite:

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

Cependant, cela pose des problèmes avec les opérations de svn de base; « Caisse » fait cette jolie chose:

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

Je n'ai aucune limitation en termes de configuration du serveur (mes machines, os, etc.). Y a-t-il un moyen de faire gérer cette traduction par Apache? J'ai regardé des hôtes virtuels de masse, mais je ne vois pas comment étendre le concept aux emplacements DAV (j'aurais aimé qu'il y ait un VirtualSvnPath ...). La façon dont mod_dav_svn vous oblige à 1) définir explicitement votre chemin svn repo, ou 2) définir le parent, est très limitée.

Peut-être le « SVNSpecialURI » peut être utile, même si je ne peux pas trouver de la documentation sur elle ...

En supposant que mon but ultime est de tracer une à un sous-domaine SVNPath, ce sont mes options?

Mon actuelle comme référence conf:

<VirtualHost *:80 *:443> 
    ServerAdmin [email protected] 
    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> 

Répondre

4

Dans l'intérêt de l'Open Source (Yay!), Je vais poster ma solution. J'ai trouvé aucune solution à mon problème intégré, donc j'ai passé quelques heures sur les sources de mod_dav_svn.so et est venu avec ce patch:

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); 
} 

Essentiellement, il saisit le nom d'hôte actuel (de la demande en attente ' request_rec '), supprime le premier jeton (sous-domaine) et le concatène avec le bon SVNParentPath (conf-> fs_parent_path) et le tour est joué! Tout fonctionne comme il se doit. Voici ma config serveur (notez à quel point il est maintenant):

<VirtualHost *:80 *:443> 
    ServerAdmin [email protected] 
    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> 

Notes:

J'espère que je correctement le apr_ * fonctions, s'il y a des mises en garde, je voudrais quelques commentaires:

Testé sur Centos avec la dernière arborescence de mod_dav_svn.