J’ai eu l’idée de cette soluce il y a plusieurs mois mais faute de temps je n’ai jamais pu la mettre en application. Il y a deux jours j’ai enfin pu m’y mettre et j’ai regretté de ne pas l’avoir fait avant !
Le cas est simple :
J’ai beaucoup de noms de domaines et je dois tous les rediriger de façon permanente (redirection 301) vers une adresse précise pour chacun d’entre eux. Je fais comment?
Eh bien, pour ça il nous faut juste un fichier .htaccess, un script php gérant la redirection et une table mysql listant les domaines et leur pages de destination !
Auparavant, je gérais tous les noms de domaines de la société qui m’emploie sur un serveur linux Plesk ; d’où mes précédents billets parlant de comment externaliser le webmail sur un autre serveur depuis Plesk ou encore de la procédure à suivre pour externaliser les emails de qmail sur un autre dédié.
Plesk est pratique pour gérer les redirections. Quand on crée un hébergement on peut choisir si c’est un hébergement physique, une redirection (301) ou une redirection par frame. Mais voila, pour chaque nom de domaine que l’on va créer on devra s’occuper de choisir les redirections manuellement pour chaque nom de domaine. Quand on a trois ou quatre noms de domaines ça va, c’est gérable. Mais si on a une trentaine ou comme j’en connais un, plus de 140 (il se reconnaitra
) ça devient très vite très long et surtout pas pratique du tout. Tout ça sans parler que Plesk, pour chaque nom de domaine va créer un virtualhost pour le domaine + tout ce qui tourne autours (en gros, 10 lignes de code pour chaque domaine) + les répertoires crées physiquement sur le serveur… Ca fait un peu beaucoup pour des noms de domaines qu’on cherche juste à rediriger !
Depuis quelques semaines, je commence à brasser tout ce que je gère sur des serveurs gentoo (d’où mes autres billets parlant des sauvegardes sur FTP en shell). Et sur Gentoo, ben c’est simple, on ne peut pas créer autre chose qu’un nom de domaine ou un alias de nom de domaine… et ça tombe bien, on n’a pas besoin de plus !
L’idée est simple, on va créer un nom de domaine qui servira de conteneur. Dans mon cas, j’ai un domaine spécialement dédié à ça mais on peut très bien prendre l’un des domaines redirigés comme base. Les autres noms de domaines vont être placés en alias du conteneur. Dans le FTP, on placera juste un .htaccess s’occupant de rediriger vers une script php externe se chargeant de trouver où le domaine doit rediriger (grace à une table sql) et s’occupera de la redirection.
Admettons qu’on ait a disposition 5 noms de domaine :
Notre domaine principal est « domaine-principal.com ». Il a son propre hébergement ailleurs. Il devra juste avoir un fichier php de redirection ; on ne s’en occupe pas pour l’instant.
On va créer un hébergement classique pour le domaine « domaine-agences.com », il servira de conteneur. Les autres noms de domaines vont être placés en alias du conteneur. L’avantage c’est que comme ça, ils pointent tous vers le même répertoire sur le serveur et ils ne demandent que des configurations minimes sur le serveur (une seule ligne « ServerAlias » dans le fichier httpd.conf + les configurations relatives aux DNS).
Sur le FTP du conteneur, dans le répertoire « www » (ou « httpdocs », cela dépend de votre installation) on va placer ce fichier .htaccess :
# HTACCESS DE REDIRECTION DE NOMS DE DOMAINES
# Developpe le : 22/04/2010
# Par : Denis Métral
# Mise en place :
# - On crée un domaine "classique" avec accès FTP et on place ce .htaccess,
# par exemple : domaine-agences.com
# - Les domaines ayant besoin d'être redirigés sont placés en tant qu'alias du domaine classique,
# par exemple : agence-grenoble.com
# - On peut mettre autant d'alias qu'on le souhaite
#
# Principe de fonctionnement
# - Au moment du chargement du domaine "agence-grenoble.com" le .htaccess va
# rediriger automatiquement en 301 sur http://www.monsite.com/redirect.php?d=agence-grenoble.com
#
DirectoryIndex index.html index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.domaine-principal\.com [NC]
RewriteRule ^(.*)$ http://www.domaine-principal.com/redirect.php?d=%{HTTP_HOST} [QSA,R=301,L]
</IfModule>
Bien sur, c’est à adapter pour votre cas. ![]()
Le .htaccess a une simple condition : Si on n’est pas sur « domaine-principal.com » redirige en 301 vers domaine-principal.com/redirect.php?d=domaine-sur-lequel-on-etais.com. Donc, si on cherchais à accéder à ce FTP après avoir tapé « agence-1.com » on va être redirigé en 301 vers domaine-principal.com/redirect.php?d=agence-1.com
C’est fini pour cette partie, on passe maintenant à la suivante (et dernière) partie
Dans la partie précédente, on a demandé au .htaccess de tout rediriger vers un script et de placer un GET le nom de domaine avec lequel on avait tenté d’accéder au FTP. Vu que maintenant, on a le nom de domaine en GET, on peut s’en servir pour faire une requete SQL sur une table listant les domaines et leurs urls de destination.
Le script PHP qui se chargera de ça :
<?php
// LES DOMAINES DES AGENCES REDIRIGENT SUR CE FICHIER ET CELUI-CI SE CHARGE DE FAIRE POINTER SUR LA BONNE PAGE
include('connexion_bdd.php');
function getDomain($Address, $onlydom=true) {
$parseUrl = parse_url(trim($Address));
$myHost = trim(isset($parseUrl['host']) ? $parseUrl['host'] : array_shift(explode('/', $parseUrl['path'], 2)));
if($onlydom){
preg_match('/[^.]+\.[^.]+$/', $myHost, $matches); // retourne uniquement les 2 derniers mots (ex : domaine.com). Posera probleme avec les .gouv.fr
$myHost = $matches[0];
}
return $myHost;
}
$redirect = $url_http_site;
$already = false;
$search = (isset($_GET['d']) && $_GET['d'] != '') ? addslashes($_GET['d']) : '';
$domaine = getDomain($search);
// SI L'ADRESSE CONCERNE UN FICHIER robots.txt
if(ereg('robots.txt',$search)){
$redirect = $url_http_site.'robots.txt';
}
// SI ON A DEJA TROUVE L'URL DE REDIRECTION
$already = ($redirect != $url_http_site) ? true : false;
// LES NOMS DE DOMAINES RECENCES EN BDD POUR LES AGENCES
if(!$already){
$req = "SELECT url FROM table_domaines WHERE domaine = '".$domaine."' LIMIT 1";
$req = mysql_query($req);
if(mysql_num_rows($req) == 1){
// ON A TROUVE L'URL DE L'AGENCE
$exe = mysql_fetch_assoc($req);
$redirect = $exe['url'];
} else {
$redirect = 'http://www.domaine-principal.com/'; // si on ne trouve rien, on redirige vers la page d'accueil
}
}
// REDIRECTION
header("Status: 301 Moved Permanently", false, 301);
header("Location: ".$redirect);
exit();
?>
Le script est simple, il trouve le domaine seul via une fonction, puis on recherche dans la base de données puis on redirige en 301 vers ce que l’on a trouvé.
On peut donc tout gérer ensuite via une administration faite en PHP / MySQL et tout se redirige proprement tout en se gérant facilement.
Voilou
là on constate que tu fais vraiment des efforts sur l’agencement de ton code, c’est propre ! rien à redire !
Ca fait plaisir de voir l’évolution, ton code est sympa !
Re,
et re-merci ^^
J’ai pas encore posé de gros codes ici (le plus gros, c’est ma fonction de génération de coordonnées GPS : http://www.denisdeejay.com/langages/php/geocodage-php-api-google-yahoo-maps-103.html et elle n’est pas si grosse que ça). J’ai pas eu le temps de poser des gros bouts de code.
Et oui, je fais de plus en plus gaffe à l’agencement de mon code, ça doit te rappeler quelque chose puisque c’est toi qui me l’a demandé si souvent il y a quelques temps déjà ^^. Vu les grosses applis que j’ai à me taper maintenant, plus le choix, sinon c’est hard en cas de maintenance et de mises à jour.