Partager des instances wordpress sans activer le multisite
Hébergé chez OVH, je cherchais à mettre en place plusieurs instances WordPress avec différents droits d’accès, mais pointant sur un même moteur pour simplifier les mises à jour. J’ai commencé par regarder du côté de la fonction multisite de WordPress 3 et je dois reconnaitre que j’ai eu un peu peur du côté usine à gaz de la chose en comparaison de la simplicité de ce que je voulais faire, en plus il fallait aller toucher au *.mon-domaine.com et je n’en avais pas trop envie.
Bilan, j’ai utilisé les outils à disposition (réduits au minimum chez OVH : du FTP et le manager qui permet de créer des sous-domaines) et des fonctionnalités historiques et simples de WordPress. Je dispose mainenant de 3 instances selon l’architecture suivante :
- www.e-gaulue.com et e-gaulue.com qui correspondent à mon blog principal
- family.e-gaulue.com qui correspond à un site à accès restreint sur la base d’une authentification HTTP au dessus d’un criptage SSL
- test.e-gaulue.com que j’utilise pour mes tests de plugins…
Tous partagent un seul et unique moteur WordPress.
La création des sites secondaires
L’idée m’est venue en analysant le fonctionnement du fichier de configuration fourni par Debian, qui commence ainsi :
/* Look up a host-specific config file in * /etc/wordpress/config-<host>.php or /etc/wordpress/config-<domain>.php */ $debian_server = preg_replace('/:.*/', "", $_SERVER['HTTP_HOST']); $debian_server = preg_replace("/[^a-zA-Z0-9.\-]/", "", $debian_server); $debian_file = '/etc/wordpress/config-'.strtolower($debian_server).'.php'; /* Main site in case of multisite with subdomains */ $debian_main_server = preg_replace("/^[^.]*\./", "", $debian_server); $debian_main_file = '/etc/wordpress/config-'.strtolower($debian_main_server).'.php'; if (file_exists($debian_file)) { require_once($debian_file); define('DEBIAN_FILE', $debian_file); } elseif (file_exists($debian_main_file)) { require_once($debian_main_file); define('DEBIAN_FILE', $debian_main_file); } elseif (file_exists("/etc/wordpress/config-default.php")) { require_once("/etc/wordpress/config-default.php"); define('DEBIAN_FILE', "/etc/wordpress/config-default.php"); } else { header("HTTP/1.0 404 Not Found"); echo "Neither <b>$debian_file</b> nor <b>$debian_main_file</b> could be found. <br/> Ensure one of them exists, is readable by the webserver and contains the right password/username."; exit(1); } |
Bien entendu, chez OVH, difficile d’aller dans /etc/wordpress
. Aussi, en le modifiant légèrement, on obtient un fichier de configuration qui va chercher la bonne configuration en fonction de l’URL demandée.
/* Récupère le chemin du fichier courant où se trouve wp-config.php*/ if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/'); $debian_server = preg_replace('/:.*/', "", $_SERVER['HTTP_HOST']); $debian_server = preg_replace("/[^a-zA-Z0-9.\-]/", "", $debian_server); $debian_file = ABSPATH.'config-'.strtolower($debian_server).'.php'; if (file_exists($debian_file)) { require_once($debian_file); } elseif (file_exists(ABSPATH."config-default.php")) { require_once(ABSPATH."config-default.php"); } else { header("HTTP/1.0 404 Not Found"); echo "Neither <b>$debian_file</b> nor <b>$debian_main_file</b> could be found. <br/> Ensure one of them exists, is readable by the webserver and contains the right password/username."; exit(1); } |
Ensuite, tout repose sur la création de liens symboliques vers l’instance partagée et l’utilisation d’une fonctionnalité présente depuis le début de WordPress pour qu’il fonctionne dans un répertoire spécifique différent de DocumentRoot
. La mise en oeuvre est décrite dans le Codex sous le nom « Giving WordPress Its Own Directory ».
Aussi, l’arborescence sur l’hebergement mutualisé d’OVH ressemble à ça :
| +-wwwbase-+ <- Contient l'installation WordPress initiale (www.e-gaulue.com) | | | +-.htaccess <- Spécifique à cet instance | +-.httppassword <- Si besoin d'une authentification | +... <- Tout le reste des fichiers WordPress | +-wp-config.php <- Fichier de conf inspiré de celui de Debian | +-config-www.e-gaulue.com.php <- Configuration de www.e-gaulue.com | +-config-family.e-gaulue.com.php <- Configuration de family.e-gaulue.com | +-config-test.e-gaulue.com.php <- Configuration de test.e-gaulue.com | +-config-e-gaulue.com.php -> config-www.e-gaulue.com.php | +-www1-+ <- Correspond au DocumentRoot du site family.e-gaulue.com | | | +-.htaccess <- Spécifique à cet instance | +-.httppassword <- Si besoin d'une authentification | +-wordpress -> ../wwwbase <- Lien symbolique vers l'installation initiale | +-www2-+ <- Correspond au DocumentRoot du site test.e-gaulue.com | +... <- Idem à www1
Configurations diverses
Base de données
Comme je ne dispose que d'une base de données chez OVH, chaque instance de blog a son propre prefixe (paramétré dans le fichier de conf spécifique à chaque instance).
Configuration pour le partage des comptes "utilisateur" WordPress
Là encore, il s'agit d'une fonctionnalité intégrée de longue date à WordPress. Il suffit d'ajouter ces lignes au fichier de configuration des instances qui pointeront sur les tables d'utilisateurs "communes" :
//Attention ceci peut varier en fonction de vos prefixes define('CUSTOM_USER_TABLE', 'wp_users'); define('CUSTOM_USER_META_TABLE', 'wp_usermeta'); |
On peut encore améliorer la configuration pour ne pas avoir à ressaisir d'identifiants quand on passe d'une instance de blog à une autre mais je n'ai pas mis en oeuvre les diverses propositions trouvées sur ce sujet. Dans mon cas, pour 2 à 3 sites, ce n'était pas primordial.
Configuration des fichiers htaccess
Personnelement, je n'aime pas avoir mes fichiers htaccess ouverts en écriture (un mode 404 est bien suffisant). Aussi, je n'utilise pas la faculté de WordPress d'y écrire directement ses règle de réécriture d'URL. Quand le fichier n'est accessible qu'en lecture, un accès à la page de configuration des permaliens de la plate-forme d'administration de WordPress vous indique les paramètres à ajouter au fichier htaccess. Généralement :
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^. /index.php [L] </IfModule> |
En plus de ces paramètres, j'y ai rajouté ceux-ci qui ne peuvent pas faire de mal :
# Pour utiliser PHP en version 5 chez OVH SetEnv PHP_VER 5 # Pour accroitre la sécurité (je ne dis pas que c'est suffisant) SetEnv REGISTER_GLOBALS 0 Options -Indexes |
Dans le fichier htaccess du site protégé (family.e-gaulue.com), on trouve en plus de ce qui précède :
# Pour forcer le mode SSL SSLRequireSSL ErrorDocument 403 https://family.e-gaulue.com # Pour gérer l'authentification http AuthUserFile /adresse_absolue_du_rep_www1_sur_le_serveur/.httppassword AuthGroupFile /dev/null AuthName "Entrer votre mot de passe" AuthType Basic Require valid-user |
On trouve dans les guide OVH de la documentation sur la création du fichier httppassword chez OVH.
Configuration dans WordPress
La principale configuration dans WordPress concerne les variables siteurl
et home
dans la table options. Elles sont accessibles en SQL mais généralement les utilisateurs préfère utiliser la page "Réglages > Général" de la plate-forme d'administration de WordPress qu'on obtient en rajoutant /wp-admin
à l'URL du blog. Cependant, quand on utilise WordPress dans un répertoire propre différent de DocumentRoot
, il faut penser à pointer vers ce répertoire sans quoi votre serveur WEB ne peut pas deviner où se trouve le répertoire wp-admin
. Dans le cas de l'instance family, c'est par exemple :
http://family.e-gaulue.com/wordpress/wp-admin
.
Comme expliqué dans "Giving WordPress Its Own Directory", siteurl alias "Adresse web de WordPress" (dans la plate-forme d'admin) correspond à l'URL complète du site, soit http://family.e-gaulue.com/wordpress
. home alias "Adresse web du site (URL)" correspond pour sa part à la page d'accueil, soit http://family.e-gaulue.com
.
4 réactions au sujet de « Partager des instances wordpress sans activer le multisite »
Bonjour,
Juste pour vous dire que vous m’avez directement aidé avec cette page.
J’ai mis en consequence un link bienveillant vers votre site ici: http://www.tafora.com/blog/2013/03/un-nouveau-blog/
Tres bien ce que vous faites ! Bravo.
Merci. Tout ceci nécessitait surtout du temps, temps que je n’ai plus trop à l’heure actuelle pour poursuivre mes recherches et faire vivre ce blog !