Carnet Wiki

Et si spip est dans un sous répertoire

Cette page expose une des manières de mutualiser le noyau de spip dans le cas où spip n’est pas installé à la racine d’un domaine. Dans un cas classique et pour pouvoir créer des sites “à la volée”, utiliser de préférence le plugin mutualisation. Je me permet de reprendre le code exposé par Matthieu Marcillaud et Committo, Ergo Sum. dans l’article officiel sur spip.net. Cet article est d’ailleurs une très bonne explication technique du principe de la mutualisation et il est indispensable de l’avoir lu pour comprendre ce qui suit...

Premier cas

SPIP est appelé par http://example.org/spip/, les sites mutualisés par http://example.org/spip/premier_site/ ou http://example.org/spip/deuxieme_site/. Les 2 sites sont “rangés” dans le dossiers

Il faut alors mettre dans le .htaccess qui doit se trouver dans le dossier spip :

RewriteEngine On
RewriteBase /spip/

#Mutualisation
RewriteRule ^(premier_site|deuxieme_site)$ /spip/$1/ [R,L]
RewriteRule ^(premier_site|deuxieme_site)/ecrire$ /$1/ecrire/ [R,L]
RewriteRule ^(premier_site|deuxieme_site)/(.*) /spip/$2 [QSA,L]

Et dans config/mes_options.php :

<?php
        $rep_install="spip/" ;
        if ( preg_match(',^/'.$rep_install.'([\.a-zA-Z0-9_-]+)/,', $_SERVER['REQUEST_URI'], $r) AND !is_dir(_DIR_RACINE . $r[1])) {
                $site = $r[1];
        } else {
                $site = $_SERVER['HTTP_HOST'];
        }

        $rep = 'sites/';
        $path = _DIR_RACINE . $rep . $site . '/';

        // ordre de recherche des chemins
        define('_SPIP_PATH',
                $path . ':' .
                _DIR_RACINE .':' . 
                _DIR_RACINE .'squelettes-dist/:' .
                _DIR_RACINE .'prive/:' .
                _DIR_RESTREINT);
        
        // ajout du dossier squelette
        if (is_dir($path . 'squelettes'))
                $GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';
        
        // exectution du fichier config/mes_option.php du site mutualise
        if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) 
                include($f); 
        
        // demarrage du site
        spip_initialisation(
                ($path . _NOM_PERMANENTS_INACCESSIBLES),
                ($path . _NOM_PERMANENTS_ACCESSIBLES),
                ($path . _NOM_TEMPORAIRES_INACCESSIBLES),
                ($path . _NOM_TEMPORAIRES_ACCESSIBLES)
        );
?>

Deuxième cas

Si on veut appeler SPIP par http://example.org/spip/, mais les sites mutualisés par http://example.org/premier_site/ ou http://example.org/deuxieme_site/ afin de cacher le noyau, il faut :

-  déplacer les règles de mutualisation dans le fichier .htaccess se trouvant à la racine du domaine :

RewriteEngine on
RewriteBase /

#Mutualisation
RewriteRule ^(premier_site|deuxieme_site)$ /$1/ [R,L]
RewriteRule ^(premier_site|deuxieme_site)/ecrire$ /$1/ecrire/ [R,L]
RewriteRule ^(premier_site|deuxieme_site)/(.*) /spip/$2 [QSA,L]

-  modifier légèrement mes_options.php

<?php
        $rep_install="" ;
        if ( preg_match(',^/'.$rep_install.'([\.a-zA-Z0-9_-]+)/,', $_SERVER['REQUEST_URI'], $r) AND !is_dir(_DIR_RACINE . $r[1])) {
                $site = $r[1];
        } else {
                $site = $_SERVER['HTTP_HOST'];
        }

        // Pas de mutualisation pour le dossier spip qui est le site maitre
        if ($site != "spip") {
                $rep = 'sites/';
                $path = _DIR_RACINE . $rep . $site . '/';

        // ordre de recherche des chemins
                define('_SPIP_PATH',
                        $path . ':' .
                        _DIR_RACINE .':' . 
                        _DIR_RACINE .'squelettes-dist/:' .
                        _DIR_RACINE .'prive/:' .
                        _DIR_RESTREINT);
        
                // ajout du dossier squelette
                if (is_dir($path . 'squelettes'))
                        $GLOBALS['dossier_squelettes'] = $rep . $site . '/squelettes';
        
                // exectution du fichier config/mes_option.php du site mutualise
                if (is_readable($f = $path . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php')) 
                        include($f); 
        
                // demarrage du site
                spip_initialisation(
                        ($path . _NOM_PERMANENTS_INACCESSIBLES),
                        ($path . _NOM_PERMANENTS_ACCESSIBLES),
                        ($path . _NOM_TEMPORAIRES_INACCESSIBLES),
                        ($path . _NOM_TEMPORAIRES_ACCESSIBLES)
                );
        }
?>

Remarque

Dans les 2 cas précédents, la mutualisation avec un autre domaine fonctionne toute seule du moment qu’il pointe sur http://example.org/spip

Page de surveillance de la mutualisation

Pour pouvoir utiliser la page de surveillance de la mutualisation du plugin “mutualisation”, installer ce plugin et rajouter en fin du fichier config/mes_options.php :

require _DIR_RACINE.'mutualisation/mutualiser.php';
$GLOBALS['mutualisation_dir'] = 'sites';
mutualisation_traiter_exec($site) ;

Cette page sera alors accessible via http://example.org/spip/ecrire/?exec=mutualisation

Yffic - Mise à jour :22 December 2015 at 12:11