Deblan blog

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.

Comment utiliser un serveur externe pour gérer les médias de Wordpress ?

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.

Diagramme de séquence

Diagramme de séquence

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 !


Ajouter un commentaire

Vous pouvez utiliser du markdown.Afficher l'aide.