Condivisione del ’core’ di SPIP

Procedura per condividere il core di SPIP tra diversi siti.

La condivisione del core di SPIP è possibile già dalla versione SPIP 1.9. Si tratta di poter gestire diversi siti SPIP su un unico server o hosting utilizzando una sola volta i file del core di SPIP.

Ciò permette un notevole guadagno di spazio sul disco, come pure di aggiornare SPIP in maniera facile su tutti i siti aggiornando solo il core.

Le versioni ulteriori di SPIP 1.9.1 semplificavano un poco la procedura, ma è solo con la versione SPIP 1.9.2 e e le sue migliorie [1] che la condivisione diventa più solida e permette l’attuazione di una condivisione del core di SPIP.

Questo articolo spiega la procedura per SPIP 1.9.2, sui server Apache [2] che autorizzi la riscrittura degli URL (url_rewriting).

Vi sono più metodi per giungere ai medesimi risultati, in base a se si desidera configurare direttamente la condivisione da un hosting o da un server.

Il concetto...

Dalla SPIP 1.9.2 le cartelle necessarie al funzionamento del core di SPIP (ecrire, dist, oo), e quelle che segnavano l’attività di un sito (config, IMG, tmp, local) sono chiaramente distinte e identificabili. Questa separazione permette di avere più siti SPIP autonomi con il medesimo core di SPIP.

Questa autonomia si basa sulla presenza di un quartetto di cartelle per ogni sito, nelle quali SPIP va a scrivere i dati generati dall’attività del sito. Queste cartelle sono appunto quattro, poiché si distinguono i dati temporanei da quelli permanenti, e i dati accessibili da http e quelli che non sono accessibili da http, quindi quattro tipi di dati. Le due cartelle non accessibili tramite http sono protette da un file .htaccess inserito automaticamente da SPIP (gli amministratori del server potranno anche mettere queste cartelle fuori dell’arborescenza servita dall’http).

Prima di SPIP 1.9.2, questi quattro tipi di dati non erano distinti in maniera chiara, e si ritrovavano nelle cartelle IMG, CACHE, ecrire e ecrire/data. Con SPIP 1.9.2, queste quattro cartelle sono distinte e chiamate con le seguenti costanti PHP:

define('_NOM_TEMPORAIRES_INACCESSIBLES', "tmp/");
define('_NOM_TEMPORAIRES_ACCESSIBLES', "local/");
define('_NOM_PERMANENTS_INACCESSIBLES', "config/");
define('_NOM_PERMANENTS_ACCESSIBLES', "IMG/");

Nel caso di una installazione di SPIP non condivisa, queste cartelle sono create alla radice del sito, quando si applica la funzione spip_initialisation sui quattro valori sopra indicati. Per ottenere la condivisione delle risorse di SPIP, è sufficiente sapere associare un URL specifico al suo quartetto di cartelle specifiche, chiamando la funzione spip_initialisation su altri quattro valori, dedotti dall’URL.

Creare le cartelle giuste

Per dare avvio alla condivisione è necessario innanzitutto partire da un sito in funzione. Per gli esempi, noi partiremo da un sito chiamato dall’URL http://esempio.org/ registrato fisicamente in /home/toto/public_html/.

E’ necessario creare una cartella (per esempio chiamato ’siti’) che va a contenere le cartelle dei siti condivisi, alla radice della distribuzione (allo stesso livello di /ecrire).

-  condivisione di una cartella:
Se si desidera che gli indirizzi http://esempio.org/primo_sito/ e http://esempio.org/secondo_sito/ chiamino ognuno un sito SPIP, è necessario creare le sottocartelle /primo_sito e /secondo_sito nella cartella /siti, poi in ognuno di essi creare le cartelle /config, /IMG, /tmp, /local. Queste quattro cartelle devono essere accessibili in scrittura. Sarà possibile in seguito aggiungere anche una cartella /squelettes allo stesso livello di queste cartelle.

-  condivisione sottodominio e dominio (alcune idee):
Se si desidera che l’indirizzo http://toto.esempio.org/, http://esempio.net/ e http://utente.esempio.com/ chiamino ognuno un sito SPIP, è possibile pensare di creare dentro /siti le cartelle /toto, /esempio.net, e /esempio.com/utente

N.B.: Tutti gli URL devono puntare alla radice della distribuzione SPIP, ovvero a /home/toto/public_html/. E’ il ruolo che avranno o un file .htaccess o la configurazione del server Apache spiegate oltre a fare la magia.

Reindirizzamenti ben congeniati!

Affinché SPIP possa riconoscere che un sito è condiviso è necessario che lo script spip.php (chiamato da index.php) venga eseguito. Questo cercherà, grazie a un codice aggiunto in /config/mes_options.php se l’URL chiamato corrisponde a un sito condiviso o meno. A tal fine è necessario che un indirizzo http://esempio.org/primo_sito/ o http://esempio.org/secondo_sito/ venga rediretto verso http://esempio.org/ per eseguire poi index.php...

Questo è il ruolo attribuito al file .htaccess (o direttamente nella configurazione del server Apache)

E’ necessario copiare e rinominare il file htaccess.txt alla radice della distribuzione in .htaccess, e in seguito modificarlo:

Per autorizzare la riscrittura dell’URL (non cambia nulla normalmente): RewriteEngine On

Se la distribuzione SPIP si trova in una sottocartella, modificare rewritebase. In questo esempio il sito è nella radice, quindi: RewriteBase /

Infine, nei parametri personalizzati, aggiungere il seguente codice affinché le cartelle /primo_sito, /secondo_sito e /terzo_sito siano trattati dalla radice della distribuzione:

#Condivisione
RewriteRule ^(primo_sito|secondo_sito|terzo_sito)$ /$1/ [R,L]
RewriteRule ^(primo_sito|secondo_sito|terzo_sito)/(.*) /$2 [QSA,L]

La prima rewriterule reindirizza gli indirizzi http://esempio.org/primo_sito verso http://esempio.org/primo_sito{{/. Il secondo reindirizza tutto quello che c’è dietro /primo_sito/ alla radice, per esempio: http://esempio.org/primo_sito/article112 viene rediretto verso http://esempio.org/article112. (Tuttavia, questo reindirizzamento è trasparente, il nome dell’URL non cambia, è sempre http://esempio.org/primo_sito/article112, anche e soprattutto per PHP!)

E se SPIP è in una sottocartella?
In tal caso, i file di SPIP si trovano in /home/toto/public_html/spip/ , SPIP viene chiamato da http://esempio.org/spip/, i siti condivisi da http://esempio.org/spip/primo_sito/ o http://esempio.org/spip/secondo_sito/.

Quindi è necessario mettere nel file .htaccess :

RewriteEngine On
RewriteBase /spip/

#Condivisione
RewriteRule ^(primo_sito|secondo_sito|terzo_sito)$ /spip/$1/ [R,L]
RewriteRule ^(primo_sito|secondo_sito|terzo_sito)/(.*) /spip/$2 [QSA,L]

E per reindirizzare tutte le cartelle come siti condivisi?

-  alla radice

RewriteCond %{REQUEST_URI} !^/(config|dist|ecrire|IMG|oo|plugins|sites|squelettes|tmp|local)/(.*)
RewriteRule ^[^/]+/(.*) /$1 [QSA,L]

-  o in una cartella /spip:

RewriteCond %{REQUEST_URI} !^/spip/(config|dist|ecrire|IMG|oo|plugins|sites|squelettes|tmp|local)/(.*)
RewriteRule ^[^/]+/(.*) /spip/$1 [QSA,L]

E per i domini e i sottodomini?
Per nostra fortuna, non c’è nulla da fare perché essi puntano normalmente già verso la radice della distribuzione di SPIP...

Condividere in base al’URL grazie a mes_options.php

La maggior parte del lavoro in questo caso viene svolta dal file /config/mes_options.php alla radice della distribuzione: questo deve cercare se un URL è condiviso o no, e inizializzare SPIP in base a ciò.

Possono verificarsi numerosi casi, tra le cartelle, i domini e i sottodomini. PHP può utilizzare due variabili per verificare gli URL che hanno chiamato lo script:

$_SERVER['REQUEST_URI']; // contiene tutto quel che c'è dietro al nome di dominio: /primo_sito/article112 per esempio...
$_SERVER['SERVER_NAME']; // contiene il nome del dominio e del sottodominio: utente.esempio.org per esempio

Queste due variabili andranno confrontate a una espressione regolare per estrarre il nome del repertorio che contiene la condivisione.

Un mezzo semplice di condividere tutte le cartelle è quello di copiare il codice seguente:

if ( preg_match(',/([a-zA-Z0-9_-]+)/?,',$_SERVER['REQUEST_URI'],$r)) {

    if (is_dir($e = _DIR_RACINE . 'sites/' . $r[1]. '/')) {

        $cookie_prefix = $table_prefix = $r[1]; 

        define('_SPIP_PATH',
            $e . ':' .
            _DIR_RACINE .':' .
            _DIR_RACINE .'dist/:' .
            _DIR_RESTREINT);

        spip_initialisation(
            ($e . _NOM_PERMANENTS_INACCESSIBLES),
            ($e . _NOM_PERMANENTS_ACCESSIBLES),
            ($e . _NOM_TEMPORAIRES_INACCESSIBLES),
            ($e . _NOM_TEMPORAIRES_ACCESSIBLES)
            );

       $GLOBALS['dossier_squelettes'] = $e.'squelettes';

        if (is_readable($f = $e._NOM_PERMANENTS_INACCESSIBLES._NOM_CONFIG.'.php')) include($f);
    }
} 

La riga preg_match preleva il nome di una cartella nell’arborescenza dell’URL, per esempio ’primo_sito’ in http://esempio.org/primo_sito/ ... In seguito lo script tenta una condivisione se è presente la cartella /siti/primo_sito/ .

Se SPIP è in una cartella /spip, è necessario modificare la prima riga con:

if ( preg_match(',/spip/([a-zA-Z0-9_-]+)/?,',$_SERVER['REQUEST_URI'],$r)) {

E’ necessario dire a SPIP qual è il prefisso della tabella del database utilizzato, e ciò si fa con $cookie_prefix = $table_prefix = $r[1];
Questa riga va a creare delle tabelle MySQL con prefissi che hanno il nome della cartella che contiene il sito: mio_sito_article al posto di spip_article per esempio. Ciò permette di ospitare tutti i siti su un solo database. E’ possibile mantenere il prefisso di default (spip), ma bisogna pensare di avere diversi database diversi per ciascun sito.
A tal fine, sostituire con:

$cookie_prefix = $r[1]; 
$table_prefix='spip';

La funzione spip_initialisation ammette quattro parametri che sono l’indirizzo di ognuno delle cartelle necessarie al funzionamento del sito condiviso.

$GLOBALS['dossier_squelettes'] = $e.'squelettes'; definisce la localizzazione della cartella squelettes del sito condiviso.

Infine, le ultime righe caricano un eventuale siti/primo_sito/config/mes_options.php.

Informazione:

Qualsiasi modifica del file config/mes_options.php del core di SPIP influenzerà le opzioni di tutti i siti ospitati.

Per esempio, mettere nel file: $type_urls = ’propres’ ;

Darà di default a tutti i siti questo tipo di URL... Ma ogni sito può cambiarlo nel proprio /siti/mio_sito/config/mes_options.php.

Configurare Apache per i domini e i sottodomini

La condivisione del lato server, per quel che riguarda la gestione dei sottodomini o dei domini rimane semplice, ma necessita di creare alcuni reindirizzamenti di URL nella configurazione del server Apache per tener conto di questi siti.

Qui sotto diamo un esempio di configurazione per un server chiamato ’esempio.net’ (in questo esempio uno SPIP condiviso) utilizzando dei sottodomini (SPIP chiamato da http://utente.esempio.org/spip/).

Il core di SPIP è in ’/home/toto/public_html/spip/’.

Quindi bisogna creare le cartelle /siti/esempio.net/ , /siti/esempio.net/utente/.

Il file di configurazione è localizzato in Apache 2/linux in /etc/apache2/siti_disponibili/default (è possibile creare anche un nuovo file nella cartella siti_disponibili e attivarla).

# SERVER esempio.net
# SPIP per sottodominio...
<VirtualHost *>
        ServerName esempio.net
	ServerAlias *.esempio.net

        # Reindirizzamento verso il core di SPIP 
	DocumentRoot "/home/toto/public_html"
	<Directory "/home/toto/public_html/">
		AllowOverride All
		Order allow,deny
		Allow from all
	</Directory>

	# Solo l'indirizzo http://utente.esempio.net/spip/* deve essere reindirizzato

	# (utente.esempio.net/spip/* -> /home/toto/public_html/*)
	RewriteCond %{SERVER_NAME} (www\.)?([^.]+)\.esempio\.net$
	RewriteRule ^/spip/(.*) /home/toto/public_html/spip/$1 [QSA,L]

	# (utente.esempio.net/* -> /home/toto/public_html/siti/esempio.net/utente/*)
	RewriteCond %{SERVER_NAME} (www\.)?([^.]+)\.esempio\.net$
	RewriteRule (.*) /home/toto/public_html/siti/esempio.net/%1/$1 [QSA,L]

</VirtualHost>

D’altronde è necessario testare queste condivisioni possibili nel file /config/mes_options.php :

# per utente.esempio.net/spip/ 
if ( preg_match(',(.*)\.esempio\.net/spip/?,',$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'],$r)) {

    if (is_dir($e = _DIR_RACINE . 'siti/esempio.net/' . $r[1]. '/')) {

       $cookie_prefix = $table_prefix = $r[1]; 

       define('_SPIP_PATH',
            $e . ':' .
            _DIR_RACINE .':' .
            _DIR_RACINE .'dist/:' .
            _DIR_RESTREINT);

        spip_initialisation(
            ($e . _NOM_PERMANENTS_INACCESSIBLES),
            ($e . _NOM_PERMANENTS_ACCESSIBLES),
            ($e . _NOM_TEMPORAIRES_INACCESSIBLES),
            ($e . _NOM_TEMPORAIRES_ACCESSIBLES)
            );

       $GLOBALS['dossier_squelettes'] = $e.'squelettes';

        if (is_readable($f = $e._NOM_PERMANENTS_INACCESSIBLES._NOM_CONFIG.'.php')) include($f);
    }
} 

Nota sul backup e sui ripristini

Ogni sito copia i suoi file di backup nella cartella /siti/primo_sito/tmp/dump (ou /siti/primo_sito/tmp/upload/login per i backup di un amministratore parziale). I ripristini dei dati si fanno tramite la stessa cartella.

Attenzione:

Attualmente SPIP registra nel database, per quel che riguarda la cartella /IMG dei siti condivisi un indirizzo siti/primo_sito/IMG/* invece di IMG/* come avviene per un unico sito SPIP.

Un ripristino dei dati funzionerà quindi solo se viene fatto nel sito che ha creato il backup.

Un trucco per ripristinare il sito altrove consiste nel modificare il file dump.xml e a sostituire tutte le occorrenze (ad eccezione di quelle di dichiarazione dir_img e dir_logo nell’apertura del segnaposto SPIP):
-  siti/primo_sito/IMG/

  • con (per SPIP da solo): IMG/
  • o con (per SPIP condiviso): siti/mio_nuovo_sito/IMG/

Viceversa, per trasferire un sito con un solo SPIP in una cartella condivisa, è necessario sostituire tutte le occorrenze di:
-  IMG/
-  con : siti/mio_sito/IMG/

Note

[1Nuova distribuzione delle cartelle per chiarire la condivisione, correzione dei problemi di login e di nomi di siti che si mischiavano talvolta tra i siti condivisi, funzione di inizializzazione di un sito da condividere più chiara

[2Per informazioni: queste procedure sono state testate con Apache 2.0.55 e PHP 5.1.2 su server Ubuntu Dapper Drake e su PHP 5.1.6 su server Ubuntu Edgy Eft

Autore Fausto Barbarito Publié le : Mis à jour : 26/10/12

Traductions : عربي, català, English, Español, français, italiano, Türkçe