Carnet Wiki

Et si spip est dans un sous répertoire

Version 2 — Juin 2010 Yffic

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 un article non publié à ce jour sur spip.net (mais on peut le consulter en s’inscrivant comme auteur de ce site). 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