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
