Wordpress : serveur de médias
J'héberge depuis quelques temps maintenant le blog d'une amie (Mizryl) sous Wordpress. Pas mal d'images sont postées et elles sont souvent grandes ce qui implique des poids de fichiers relativement importants. Le problème majeur c'est que derrière ma ligne ADSL, uploader 500Ko ou 1Mo ça prend plus de temps que chez un hébergeur fibré. J'ai quelques serveurs dédiés chez des prestataires et je me suis dis qu'en utiliser un pour les médias du blog serait une bonne idée.
Mes contraintes étaient les suivantes : ne pas modifier la gestion des médias dans le backend du site et ne surtout pas être dépendant de ce serveur pour l'hébergement des médias.
Dans un premier temps, j'ai créé un sous domaine de mizryl.fr qui est medias.mizryl.fr. Ce dernier pointe sur un serveur dédié chez Online (dedibox). J'ai configuré Apache pour avoir un répertoire de travail sur ce serveur.
Dans la gestion des réglages de Wordpress, j'ai modifié l'adresse complète pour les fichiers par http://medias.mizryl.fr.
Cette configuration change les URL des médias de http://mizryl.fr/wp-content/uploads/aaaa/mm/mon_fichier.ext à http://medias.mizryl.fr/aaaa/mm/mon_fichier.ext. Cependant, ce paramétrage ne modifie en rien le comportement de Wordpress : les fichiers sont toujours uploadés sur le serveur qui héberge le blog (une de mes contraintes).
Si je m'arrête ici, aucun média ne sera accessible : on aura bien les URL vers la dedibox mais aucun média est hébergé dessus. Pour ce faire, j'ai placé sur le serveur de médias deux fichiers : un script pour va téléchager les médias sur mizryl.fr
et un htaccess va faire pointer les erreurs 404 vers le script.
Le htaccess : .htaccess :
ErrorDocument 404 /dl.php
Le script de téléchargement : dl.php
Il va récupérer les requêtes qui ont généré une erreur 404. Il va effectuer le téléchargement du médias et rediriger l'utilisateur dessus.
<?php
$request_uri = str_replace('..', '', $_SERVER['REQUEST_URI']);
$url = 'http://mizryl.fr/wp-content/uploads'.$request_uri;
$dirs = explode('/', preg_replace('`^/*([0-9]+/[0-9]+/)[^\s]+`', '$1', $request_uri));
$media = preg_replace('`^/*[0-9]+/[0-9]+/([^\s]+)$`', '$1', $request_uri);
$remote_media_content = @file_get_contents($url);
if (!$remote_media_content) {
die("Download failed");
}
foreach ($dirs as $d) {
if (trim($d) == "") {
continue;
}
if (!is_dir($d)) {
mkdir($d);
}
chdir($d);
}
if (!$remote_media_content) {
die("Download failed");
}
file_put_contents(
$media,
$remote_media_content
);
header('Location: '.$media.'?'.time());
Cette méthode fonctionne nickel. Si vous avez des idées pour améliorer l'idée, ça sera avec plaisir !

Expiration de certificats SSL
Fin avril dernier, j'ai publié un projet qui génère un récapitulatif de la date d'expiratio…

Outil de création d’un espace web Apache et PHP
Dans mon activité personnelle et professionnelle, je suis amené à créer des espaces d’héber…

API pour récupérer le contenu Open Graph d'une page web
Pour la fonctionnalité de partage de liens sur ce blog, j'ai développé un script qui récupé…