Utiliser mod_rewrite sans avoir le module apache
voici une classe php permettant d’utiliser le mod_rewrite sans en avoir le module apache :
<?php ///////////////////////////////////////////////////////////////////////////// // PHPrewrite // ///////////////////////////////////////////////////////////////////////////// // Auteur : Shisui (Base de divers auteurs) // Version : 1.1 // Description : Remplacement PHP du mod rewrite d'Apache, permettant une // redirection d'URL meme sur les serveurs n'ayant pas activé // ce module. // Notes : C'est un code que j'ai trouvé plusieurs fois sur Internet, mais qui // à l'origine était long à mettre en place (une condition par itération) // Cette version ci est donc plus perfectionnée grace à sa compatibilité // avec les expressions du mod rewrite original. // Installation : L'installation est simple, il suffit de placer toutes les // régles en cohésion avec le mod original dans le fichier // spécifié dans la configuration ci dessous. De configurer celle ci, // puis de mettre dans un .htaccess à la racine de votre site : // ErrorDocument 404 /urlrewriting.php // // Changelog : 1.1 - Mise en place de la compatibilité avec le mod original // 1.0 - Version de base trouvée sur internet // ////////////////////////// Configuration ///////////////////////// // Configurez au mieux ces options, sans quoi le script pourrait // ne pas (ou mal) fonctionner. $config'FichierConf' = ".rewritemod"; // Nom du fichier ou se trouvent les directives à appliquer (Nom) $config'ForcerNonVerif' = TRUE; // Focer la non-vérification de la ligne "RewriteEngine On" (TRUE|FALSE) $config'RespecterCasse' = FALSE; // Respecter la casse dans les expressions réguliéres (TRUE|FALSE) $config'404MessPerso' = ''; // Message perso à afficher à la place de l'erreur 404 classique, laisser vide si défaut (Message en html comprenant <title> </head> <body>...) $config'404Langue' = 'fr'; // Langue du message 404 par défaut $config'404en' = '<title>404 Not Found</title></head><body><h1>Not Found</h1>The requested URL '.$_SERVER'REQUEST_URI'.' was not found on this server'; // Message 404 en anglais $config'404fr' = '<title>404 Non Trouvée</title></head><body><h1>Non Trouvée</h1>L\'URL demandée '.$_SERVER'REQUEST_URI'.' n\'a pas été trouvée sur ce serveur'; // Message 404 en francais ////////////////// Fin de la configuration ! ////////////////////// ///////////////////////////////////////////////////////////////////// // La modification du code suivant peut ne plus faire fonctionner // // le script, alors attention ! // ///////////////////////////////////////////////////////////////////// error_reporting(E_ALL); // On affiche tout les messages d'alerte. function mod_active() { //D: Fonction servant à savoir si Rewrite engine On est présent dans le fichier de régles //R: (TRUE|FALSE) $handle = fopen($config'FichierConf',"r"); // ouverture du fichier $fichier = fread($handle, filesize($config'FichierConf')); // lecture de son contenu fclose ($handle); // fermeture du fichier if (eregi("RewriteEngine On",$fichier)) { // si le ligne se trouve dans le fichier return true; // on retourne TRUE } else { return false; // sinon FALSE } } function regle_info($ligneregle) { //D: Fonction servant à retourner les informations d'une régle sous forme de tableau //R: Masque d'entrée (MASQUEE) Masque de sortie (MASQUES) et les Flags (Drapeaux) avec leur nombre $regle = str_replace("RewriteRule", '',$ligneregle); // On supprime le "RewriteRule" du début de la ligne $regle = split(" +",trim($regle)); // On sépare les différentes itérations $count = count($regle); if ($count != 3) { return FALSE; } $flags = str_replace("]","",str_replace("","",$regle[2)); // On enléve les et entourants les flags $flags = explode(",",$flags); // On les séparent array_unshift($flags, count($flags)); // Et on ajoute le nombre de flags en position 0 return array("MASQUEE" => $regle0, "MASQUES" => $regle1, "FLAGS" => $flags); // Et on retourne le tableau de valeurs } function url_rewrite($page,$masqueE,$masqueS) { // D: Fonction qui retourne la page réécrite en fonction de la page spécifiée et // du masque d'entrée ou FALSE si ils ne correspondent pas // R: Page réécrite ou FALSE // Exemple de masque d'entrée : ^page-(0-9+)-(0-9+)\.html$ // Exemple de masque de sortie : article.php?numero=&page= // Exemple de page demandée : article-8125-2.html // Page réécrite : article.php?numero=8125&page=2 if ($masqueE && ereg($masqueE, $page, $vars)) { // On regarde si le masque d'entrée et la page correspondent $urlrewrite = $masqueS; // Si oui on définit $urlrewrite $i = 0; // on initialise $i $c = count($vars) - 1; while ($i <= $c) { // et on fait une boucle, tant que $i sera inférieur au nombre de variables $urlrewrite = str_replace("$".$i, $vars$i, $urlrewrite); // on remplace la variable "" par exemple par sa correspondance $vars1 $i++; // on refait un tour ... } return $urlrewrite; // on retourne l'url réécrite } else { // si le masque et la page ne correspondent pas ... return FALSE; // on retourne FALSE } } function get_page_vars($page,$mode = "getvars") { // D: Fonction qui retourne un tableau de valeur des variables passées à une page // R: Tableau de valeur de type Array( VAR => valeur ) // Exemple : $_GET = get_page_vars("index.php?page=news&id=5"); // Retournera le tableau $_GET tel que : // $_GET'page' == "news" // et $_GET['id'} == "5" // $page = get_page_vars("index.php?page=news&id=5","page"); // Retournera "index.php" if ($mode == "getvars") { if (ereg("(.*)\?(.*)",$page,$vars)) { // On vérifie que l'adresse posséde des variables (page?variables) // et on récupére le bloc de variables $get = $vars2; //on définit $get comme le bloc de variable if (ereg("(.*)\&(.*)",$get,$vars)) { // on regarde si plusieurs vars sont définies (blocvar1&blocvar2) array_shift($vars); // on supprime le $vars0 qui correspond à $get foreach ($vars as $val) { // pour chaque bloc de variables if (ereg("(.*)\=(.*)",$val,$var)) { // on regarde si ca correspond bien à une déf de var (var1=valeur) $GETVARS$var[1] = $var2; // on définit le tableau } } return $GETVARS; // que l'on retourne ... } elseif (ereg("(.*)\=(.*)",$get,$var)) { // il n'y a pas plusieurs blocs de var, donc on regarde si il y en a au moins un $GETVARS$var[1] = $var2; // on définit l'unique variable return $GETVARS; // on retourne le tableau } else { // la page passée n'a pas de variables correctes en parametres return FALSE; // on retourne FALSE } } else { // la page passée n'a pas de variables en paramétres return FALSE; // on retourne FALSE } } else { if (ereg("(.*)\?(.*)",$page,$vars)) { // Si la page est bien consituée de la forme url?vars return $vars1; // On retourne juste la page } else { return $page; // Sinon on retourne la page passée en paramétres } } } ////////////////////////////////////////// //// On commence les choses sérieuses //// ////////////////////////////////////////// if (!$config'ForcerNonVerif' && !mod_active()) { // Si on a pas forcé la non vérification du RewriteEngine On et que<br> // cette ligne n'est pas présente ... header("HTTP/1.0 404 Not Found"); // On envoie en header que la page n'existe pas echo '<html><head>'; // on commence l'affichage de la page if (!$config'404MessPerso') { // si le message perso n'est pas défini echo $config'404'.$config['404Langue']; // on affiche le message classique d'erreur 404 dans la langue spécifiée } else { // sinon echo $config'404MessPerso'; // on affiche le message perso } echo "<p><hr>".$_SERVER'SERVER_SIGNATURE'."</body></html>"; // et la signature du serveur (pour faire plus vrai :D) exit; // on quitte ce script } else { // si la non vérification est forcée ou que RewriteEngine on est dans le fichier $req = substr_replace($REQUEST_URI, '', 0, 1); // on définit la page demandée sans le premier / de $REQUEST_URI $handle = fopen($config'FichierConf',"r"); // on ouvre le fichier $texte = fread($handle, filesize($config'FichierConf')); // on met tout le texte dans $texte $ligne = preg_split("/\n/", $texte); // on coupe le texte en tableau apr rapport aux sauts de ligne $lignes_tot = count($ligne) - 1; // on compte le nombre de ligne for ($i=0; $i <= $lignes_tot; $i++) { // depuis que $i=1 et qu'il est inférieur au nombre de lignes, on incrémente $i à chaque fois $regle = regle_info($ligne$i); // on appelle la fonction regle_info pour connaitre les masques de la regle if (!$regle) { // Si régle est défini à FALSE $url_sortie = FALSE; // On définit $url sortie à false } else { // sinon .... $url_sortie = url_rewrite($req,$regle"MASQUEE",$regle"MASQUES"); // on regarde si l'url demandée correspond à cette page } if ($url_sortie) { // si oui header("HTTP/1.0 200 OK"); // on indique que la page est bonne $_GET = get_page_vars($url_sortie); // on initialise le tableau get avec les éventuelles variables du masque de sortie include(get_page_vars($url_sortie,"page")); // on inclus la page exit; // on arrete ce script } else { // si la page demandée, et le masque d'entrée de la régle ne correspondent pas if ($i == $lignes_tot) { // et que c'est la derniére ligne header("HTTP/1.0 404 Not Found"); // On envoie en header que la page n'existe pas echo '<html><head>'; // on commence l'affichage de la page if (!$config'404MessPerso') { // si le message perso n'est pas défini echo $config'404'.$config['404Langue']; // on affiche le message classique d'erreur 404 dans la langue spécifiée } else { // sinon echo $config'404MessPerso'; // on affiche le message perso } echo "<p><hr>".$_SERVER'SERVER_SIGNATURE'."</body></html>"; // et la signature du serveur (pour faire plus vrai :D) exit; // on quitte ce script } } } } ?>
Et voilà c’est fini 😀
source : http://www.phpcs.com/code.aspx?ID=33296