begin process at 2012 05 27 20:47:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > URL REWRITING EN PHP (RESPECTE LES RÉGLES DU MOD_REWRITE)

URL REWRITING EN PHP (RESPECTE LES RÉGLES DU MOD_REWRITE)


 Information sur la source

Note :
9,11 / 10 - par 9 personnes
9,11 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Classé sous :url, rewriting, mod, rewrite, rewriteengine Niveau :Expert Date de création :18/08/2005 Date de mise à jour :20/09/2005 18:23:08 Vu / téléchargé :22 729 / 752

Auteur : Shisui

Ecrire un message privé
Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note

 Description

Pour ma premiére source c'est un mod_rewrite en PHP (Il y a une source de ce type sur le site mais elle est complétement différente) qui gére les régles originales du mod_rewrite pour Apache, y compris les expressions réguliéres. Le script permet, via la directive ErrorDocument 404 du .htaccess, de rediriger si il le faut la page demandée vers une autre page, sans modifier le contenu de la barre d'adresse (utilisation d'un include et non d'un header)
Le script gére les directives du mod_rewrite (toutes les lignes "RewriteRule"), ainsi que les erreurs 404 si l'url ne correspond à rien, et d'autres redirections

L'installation est simple et rapide : on crée un fichier .htaccess si il n'y en avait pas avant, on le met à la racine du siten et on y insére cette ligne : "ErrorDocument 404 /urlrewriting.php" (sans les " " bien sur) et en remplacant urlrewriting.php par le nom de la page php si vous l'avez renommé

Ensuite il reste à ouvrir le fichier en question et à le configurer :
- config['FichierConf'] désigne le nom du fichier qui contient toutes les régles à appliquer aux urls (ca ne doit PAS etre le fichier .htaccess, qui générerait une ereur si il ne reconnaissait pas les directives RewriteRule / RewriteEngine vu que le mod est desactivé),
- config['ForcerNonVerif'] spécifie si le script doit, ou non, vérifier si la ligne "RewriteEngine On" est présente dans le fichier (utile pour desactiver l'url rewriting quand on veut, mais peut ralentir un peut l'execution)
- config['LangueDefaut'] langue par défaut des erreurs, par défaut les langues existantes sont l'anglais et le français, l'anglais pour la "transparence" du script, les messages d'erreurs sont exactement les memes que ceux affichés en temps normal :)

Le reste des options etant facultatif (Erreurs 404) et bien commenté dans la source :)

Source

  • <?php
  • /////////////////////////////////////////////////////////////////////////////
  • // Nom : PHPrewrite
  • //
  • // Auteur : Shisui
  • //
  • // Version : 1.2
  • //
  • // 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.2 - Utilisation d'une classe sur les conseils de XaF
  • // Pourquoi une classe ? Tout simplement pour améliorer
  • // (un peu) la rapidité et pour que le code soit moins
  • // "brouillon", il est mieux structuré et ainsi plus
  • // facile à comprendre, et donc à modifier, adapter.
  • // - Mise en place du systéme de casse
  • // - Support de nouveaux flags :
  • // . QSA : "Query String Append"
  • //
  • // 1.1 - Premiére version de ce script
  • // 1.0 - Version de base trouvée sur internet
  • //
  • // A faire : - Compréhension des RewriteCond (30%)
  • // - Flags :
  • // . QSA : "Query String Append", ajouter
  • // les paramétres demandés à l'url source
  • // vers l'url de sortie.
  • // - Debug (Ca restera toujours à faire :])
  • //
  • //////////////////////////////////////////////////////////////////////////////
  • error_reporting(E_ALL); // Affichage de toutes les erreurs
  • class PHPRewrite {
  • // Initialisation des variables utilisées dans la classe
  • var $config;
  • var $erreur;
  • var $UrlReq;
  • var $ligne;
  • var $RespectCasse;
  • var $LignesTot;
  • var $url_sortie;
  • var $i;
  • var $QSA;
  • var $Chainage;
  • function PHPRewrite() {
  • /////////////////////////////////
  • //// Configuration du script ////
  • /////////////////////////////////
  • $this->config['FichierConf'] = ".rewritemod"; // Nom du fichier ou se trouvent les directives à appliquer ([Nom])
  • $this->config['ForcerNonVerif'] = FALSE; // Focer la non-vérification de la ligne "RewriteEngine On" (TRUE|FALSE)
  • $this->config['LangueDefaut'] = 'en'; // Langue utilisée pour les erreurs, voir ci dessous
  • //// Fin de la configuration ////
  • //// Configuration des Erreurs ////
  • $this->erreur['header']['301'] = "HTTP/1.0 301 Permanently Moved";
  • $this->erreur['header']['302'] = "HTTP/1.0 302 Temporarily Moved";
  • $this->erreur['header']['404'] = "HTTP/1.0 404 Not Found"; // Header à envoyer
  • $this->erreur['404']['en']['titre'] = "Not Found"; // Titre de l'erreur
  • $this->erreur['404']['en']['expli'] = "The requested URL %u% was not found on this server"; // Description, %u% = url demandée
  • $this->erreur['header']['403'] = "HTTP/1.0 403 Forbidden";
  • $this->erreur['403']['en']['titre'] = "Forbidden";
  • $this->erreur['403']['en']['expli'] = "You don't have permission to access %u% on this server";
  • $this->erreur['header']['410'] = "HTTP/1.0 410 Gone";
  • $this->erreur['410']['en']['titre'] = "Gone";
  • $this->erreur['410']['en']['expli'] = "The requested resource<br />%u%<br />is no longer available on this server and there is no forwarding address. Please remove all references to this resource.";
  • ///// Fin de la configuration /////
  • $this->Chainage = TRUE;
  • $this->RespectCasse = TRUE;
  • $this->UrlReq = substr_replace($_SERVER['REQUEST_URI'], '', 0, 1);
  • }
  • function OuvrirFichier() {
  • if (!$this->config['ForcerNonVerif'] && !$this->mod_active()) {
  • $this->erreur();
  • exit;
  • }
  • else {
  • $handle = fopen($this->config['FichierConf'],"r");
  • $texte = fread($handle, filesize($this->config['FichierConf']));
  • $this->ligne = preg_split("/\n/", $texte);
  • $this->LignesTot = count($this->ligne) - 1;
  • }
  • }
  • function RedirectUrl() {
  • $i = 0;
  • while ($this->i <= $this->LignesTot) {
  • $this->ligne[$this->i] = (!empty($this->ligne[$this->i]))?$this->ligne[$this->i]:"#";
  • if (substr($this->ligne[$this->i],0,1) == "#") {
  • if ($this->i == $this->LignesTot) {
  • $this->erreur();
  • exit;
  • }
  • $this->i++;
  • }
  • else {
  • $this->getUrlSortie($this->i);
  • if ($this->url_sortie) {
  • header("HTTP/1.0 200 OK");
  • if (!$this->QSA) { $_GET = ""; }
  • $_GET = $this->getPageVars($this->url_sortie);
  • include($this->getPageVars($this->url_sortie,"page"));
  • exit;
  • }
  • else {
  • if ($this->i == $this->LignesTot) {
  • $this->erreur();
  • exit;
  • }
  • }
  • $this->i++;
  • }
  • }
  • }
  • function getUrlSortie($L) {
  • $regle = (!empty($this->ligne[$L]))?$this->regle_info($this->ligne[$L]):FALSE;
  • if ($regle) {
  • if ((!$this->RespectCasse) || ($this->flagPresent("NC",$regle["FLAGS"]))) $Correspondance = eregi($regle['MASQUEE'], $this->UrlReq);
  • else $Correspondance = ereg($regle['MASQUEE'], $this->UrlReq);
  • if ($Correspondance) {
  • if ($this->Chainage && ($this->flagPresent("C",$regle["FLAGS"]))) {
  • $this->url_sortie = $this->url_rewrite($this->UrlReq,$regle["MASQUEE"],$regle["MASQUES"]);
  • $this->Chainage = TRUE;
  • $this->UrlReq = $this->url_sortie;
  • $this->url_sortie = FALSE;
  • }
  • else {
  • if ($this->flagPresent("F",$regle["FLAGS"])) {
  • $this->erreur("403");
  • }
  • elseif ($this->flagPresent("G",$regle["FLAGS"])) {
  • $this->erreur("410");
  • }
  • elseif ($this->flagPresent("^R(=[[:alnum:]]{3})?$",$regle["FLAGS"])) {
  • if ($this->flagPresent("^R$",$regle["FLAGS"])) {
  • $this->erreur("302","en",$this->url_rewrite($this->UrlReq,$regle['MASQUEE'],$regle['MASQUES']));
  • }
  • else {
  • ereg("^R(=[[:alnum:]]{3})?$",$this->flagPresent("^R(=[[:alnum:]]{3})?$",$regle["FLAGS"]),$res);
  • $res = substr_replace($res[1],'',0,1);
  • $this->erreur($res,"en",$this->url_rewrite($this->UrlReq,$regle['MASQUEE'],$regle['MASQUES']));
  • }
  • }
  • else {
  • $this->url_sortie = $this->url_rewrite($this->UrlReq,$regle["MASQUEE"],$regle["MASQUES"]);
  • if ($this->flagPresent("^N$",$regle["FLAGS"])) {
  • $this->UrlReq = $this->url_sortie;
  • $this->url_sortie = FALSE;
  • $this->i = -1;
  • }
  • elseif ($this->flagPresent("^C$",$regle["FLAGS"])) {
  • $this->Chainage = TRUE;
  • $this->UrlReq = $this->url_sortie;
  • $this->url_sortie = FALSE;
  • }
  • elseif ($this->flagPresent("^QSA$",$regle["FLAGS"])) {
  • $this->QSA = TRUE;
  • }
  • }
  • }
  • }
  • else $this->url_sortie =FALSE;
  • }
  • else $this->url_sortie = FALSE;
  • }
  • function erreur($num = "404",$langue,$redir = FALSE) {
  • //D: Fonction servant à afficher un message d'erreur
  • if(!isset($langue)) $langue = $this->config['LangueDefaut'];
  • if (!isset($this->erreur['header'][$num])) {
  • exit("Titre ou description de code introuvable pour l'erreur ou la langue spécifiée");
  • }
  • else {
  • header($this->erreur['header'][$num]);
  • if (!$redir) {
  • echo '<html><head><title>'.$this->erreur[$num][$langue]['titre'].'</title></head>';
  • echo '<body><h1>'.$this->erreur[$num][$langue]['titre'].'</h1>'.str_replace("%u%",$_SERVER['REQUEST_URI'],$this->erreur[$num][$langue]['expli']);
  • echo "<p><hr><address>".$_SERVER['SERVER_SIGNATURE']."</address></body></html>";
  • exit;
  • }
  • else {
  • header('Location: '.$redir);
  • exit;
  • }
  • }
  • }
  • 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($this->config['FichierConf'],"r"); // ouverture du fichier
  • $fichier = fread($handle, filesize($this->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
  • if (count($regle) != 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" => $regle[0], "MASQUES" => $regle[1], "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=$1&page=$2
  • // Exemple de page demandée : article-8125-2.html
  • // Page réécrite : article.php?numero=8125&page=2
  • if (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
  • while ($i <= count($vars) - 1) { // 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 "$1" par exemple par sa correspondance $vars[1]
  • $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 getPageVars($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 = $vars[2]; //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 $vars[0] 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]] = $var[2]; // 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]] = $var[2]; // 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 $vars[1]; // On retourne juste la page
  • }
  • else {
  • return $page; // Sinon on retourne la page passée en paramétres
  • }
  • }
  • }
  • function flagPresent($flag,$array) {
  • //D: Fonction servant à savoir si le flag $flag est précisé dans le tableau $array retourné par regle_info['FLAGS']
  • //R: (FALSE|flag)
  • if (!is_array($array)) {
  • return FALSE;
  • }
  • else {
  • foreach ($array as $v => $k) {
  • if (ereg($flag, $k)) {
  • return $k;
  • }
  • }
  • }
  • }
  • function BaseServeur($uri) {
  • //D: Fonction qui retourne la base d'une URI passée en paramétre
  • //R: (uri_base)
  • if (substr($uri,0,7) == "http://") { // si l'url posséde le http:// du début
  • $url = split("/",$uri); // on coupe $url tout les /
  • $url = $url[2]; // on prend le troisiéme
  • }
  • else {
  • $url = split("/",$uri);
  • $url = $url[0];
  • }
  • return "http://".$url; // on retourne l'url de base
  • }
  • }
  • ///////////////////////////////////////////////////////////////////////
  • ///////////////////////////////////////////////////////////////////////
  • // Appel de la classe !
  • // Sans ca tout ce qu'il y a au dessus ne sert plus à rien :)
  • ///////////////////////////////////////////////////////////////////////
  • $phpR = new PHPRewrite(); // Création de la classe
  • $phpR->OuvrirFichier(); // On ouvre le fichier et on voit si il est conforme à la config.
  • $phpR->RedirectUrl(); // Et hop, on redirige ...
  • ?>
<?php
/////////////////////////////////////////////////////////////////////////////
// Nom :          PHPrewrite
//
// Auteur :       Shisui
//
// Version :      1.2   
//
// 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.2 - Utilisation d'une classe sur les conseils de XaF
//						Pourquoi une classe ? Tout simplement pour améliorer
//						(un peu) la rapidité et pour que le code soit moins
//						"brouillon", il est mieux structuré et ainsi plus
//						facile à comprendre, et donc à modifier, adapter.
//                    - Mise en place du systéme de casse
//					  - Support de nouveaux flags :
//						. QSA : "Query String Append"
//
//                1.1 - Premiére version de ce script
//                1.0 - Version de base trouvée sur internet
//
// A faire :	- Compréhension des RewriteCond (30%)
//				- Flags :
//					. QSA : "Query String Append", ajouter
//							les paramétres demandés à l'url source
//							vers l'url de sortie.
//				- Debug (Ca restera toujours à faire :])
//				
//////////////////////////////////////////////////////////////////////////////
error_reporting(E_ALL);		// Affichage de toutes les erreurs


class PHPRewrite {
	// Initialisation des variables utilisées dans la classe
	var $config;
	var $erreur;
	var $UrlReq;
	var $ligne;
	var $RespectCasse;
	var $LignesTot;	
	var $url_sortie;
	var $i;
	var $QSA;
	var $Chainage;
	
	function PHPRewrite() {
		/////////////////////////////////
		//// Configuration du script ////
		/////////////////////////////////
		$this->config['FichierConf'] = ".rewritemod"; 	// Nom du fichier ou se trouvent les directives à appliquer ([Nom])
		$this->config['ForcerNonVerif'] = FALSE; 		// Focer la non-vérification de la ligne "RewriteEngine On" (TRUE|FALSE)
		$this->config['LangueDefaut'] = 'en';			// Langue utilisée pour les erreurs, voir ci dessous
		//// Fin de la configuration ////
		
		
		//// Configuration des Erreurs ////	
		$this->erreur['header']['301'] = "HTTP/1.0 301 Permanently Moved";
		$this->erreur['header']['302'] = "HTTP/1.0 302 Temporarily Moved";
		$this->erreur['header']['404'] = "HTTP/1.0 404 Not Found";	// Header à envoyer
		$this->erreur['404']['en']['titre'] = "Not Found";	// Titre de l'erreur
		$this->erreur['404']['en']['expli'] = "The requested URL %u% was not found on this server"; // Description, %u% = url demandée
		
		$this->erreur['header']['403'] = "HTTP/1.0 403 Forbidden";
		$this->erreur['403']['en']['titre'] = "Forbidden";
		$this->erreur['403']['en']['expli'] = "You don't have permission to access %u% on this server";
		
		$this->erreur['header']['410'] = "HTTP/1.0 410 Gone";
		$this->erreur['410']['en']['titre'] = "Gone";
		$this->erreur['410']['en']['expli'] = "The requested resource<br />%u%<br />is no longer available on this server and there is no forwarding address. Please remove all references to this resource.";
		///// Fin de la configuration /////		
		
		$this->Chainage = TRUE;
		$this->RespectCasse = TRUE;
		$this->UrlReq = substr_replace($_SERVER['REQUEST_URI'], '', 0, 1);
	}
	
	function OuvrirFichier() {
		if (!$this->config['ForcerNonVerif'] && !$this->mod_active()) {
			$this->erreur();
			exit;
		}
		else {				
			$handle = fopen($this->config['FichierConf'],"r");
			$texte = fread($handle, filesize($this->config['FichierConf']));
			$this->ligne = preg_split("/\n/", $texte);
			$this->LignesTot = count($this->ligne) - 1;
		}
	}
	
	function RedirectUrl() {
		$i = 0;
		while ($this->i <= $this->LignesTot) {		
			$this->ligne[$this->i] = (!empty($this->ligne[$this->i]))?$this->ligne[$this->i]:"#";	
			if (substr($this->ligne[$this->i],0,1) == "#") {
				if ($this->i == $this->LignesTot) {
					$this->erreur();
					exit;
				}
				$this->i++; 
			}
			else {
				$this->getUrlSortie($this->i);
				if ($this->url_sortie) {
					header("HTTP/1.0 200 OK");
					if (!$this->QSA) { $_GET = ""; }
					$_GET = $this->getPageVars($this->url_sortie);
					include($this->getPageVars($this->url_sortie,"page"));
					exit;
				}
				else {
					if ($this->i == $this->LignesTot) {
						$this->erreur();
						exit;
					}
				}
				$this->i++;
			}
		}	
	}
	
	function getUrlSortie($L) {
		$regle = (!empty($this->ligne[$L]))?$this->regle_info($this->ligne[$L]):FALSE;
		
		if ($regle) {
			if ((!$this->RespectCasse) || ($this->flagPresent("NC",$regle["FLAGS"]))) $Correspondance = eregi($regle['MASQUEE'], $this->UrlReq);
			else $Correspondance = ereg($regle['MASQUEE'], $this->UrlReq); 
			
			if ($Correspondance) {				
				if ($this->Chainage && ($this->flagPresent("C",$regle["FLAGS"]))) {					
					$this->url_sortie = $this->url_rewrite($this->UrlReq,$regle["MASQUEE"],$regle["MASQUES"]);
					$this->Chainage = TRUE;
					$this->UrlReq = $this->url_sortie;
					$this->url_sortie = FALSE;
				}
				else {
					if ($this->flagPresent("F",$regle["FLAGS"])) {
						$this->erreur("403");
					}
					elseif ($this->flagPresent("G",$regle["FLAGS"])) {
						$this->erreur("410");
					}
					elseif ($this->flagPresent("^R(=[[:alnum:]]{3})?$",$regle["FLAGS"])) {
						if ($this->flagPresent("^R$",$regle["FLAGS"])) {
							$this->erreur("302","en",$this->url_rewrite($this->UrlReq,$regle['MASQUEE'],$regle['MASQUES']));
						}
						else {
							ereg("^R(=[[:alnum:]]{3})?$",$this->flagPresent("^R(=[[:alnum:]]{3})?$",$regle["FLAGS"]),$res);
							$res = substr_replace($res[1],'',0,1);
							$this->erreur($res,"en",$this->url_rewrite($this->UrlReq,$regle['MASQUEE'],$regle['MASQUES']));
						}
					}
					else {
						$this->url_sortie = $this->url_rewrite($this->UrlReq,$regle["MASQUEE"],$regle["MASQUES"]);
						if ($this->flagPresent("^N$",$regle["FLAGS"])) {
							$this->UrlReq = $this->url_sortie;
							$this->url_sortie = FALSE;
							$this->i = -1;
						}
						elseif ($this->flagPresent("^C$",$regle["FLAGS"])) {
							$this->Chainage = TRUE;
							$this->UrlReq = $this->url_sortie;
							$this->url_sortie = FALSE;
						}
						elseif ($this->flagPresent("^QSA$",$regle["FLAGS"])) {
							$this->QSA = TRUE;
						}
					}
				}
			}
			else $this->url_sortie =FALSE;
		}		
		else $this->url_sortie = FALSE;	
	}
	
	function erreur($num = "404",$langue,$redir = FALSE) {
		//D: Fonction servant à afficher un message d'erreur
		if(!isset($langue)) $langue = $this->config['LangueDefaut'];
		if (!isset($this->erreur['header'][$num])) {
			exit("Titre ou description de code introuvable pour l'erreur ou la langue spécifiée");
		}
		else {
			header($this->erreur['header'][$num]);
			if (!$redir) {
				echo '<html><head><title>'.$this->erreur[$num][$langue]['titre'].'</title></head>';
				echo '<body><h1>'.$this->erreur[$num][$langue]['titre'].'</h1>'.str_replace("%u%",$_SERVER['REQUEST_URI'],$this->erreur[$num][$langue]['expli']);
				echo "<p><hr><address>".$_SERVER['SERVER_SIGNATURE']."</address></body></html>";
				exit;
			}
			else {
				header('Location: '.$redir);
				exit;
			}
		}
	}
                                   
	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($this->config['FichierConf'],"r"); // ouverture du fichier
		$fichier = fread($handle, filesize($this->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
		if (count($regle) != 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" => $regle[0], "MASQUES" => $regle[1], "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=$1&page=$2
		// Exemple de page demandée : article-8125-2.html
		// Page réécrite : article.php?numero=8125&page=2
		if (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
			while ($i <= count($vars) - 1) { // 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 "$1" par exemple par sa correspondance $vars[1]
				$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 getPageVars($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 = $vars[2]; //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 $vars[0] 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]] = $var[2]; // 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]] = $var[2]; // 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 $vars[1]; // On retourne juste la page
			}
			else {
				return $page; // Sinon on retourne la page passée en paramétres
			}
		}
	}
	
	function flagPresent($flag,$array) {
		//D: Fonction servant à savoir si le flag $flag est précisé dans le tableau $array retourné par regle_info['FLAGS']
		//R: (FALSE|flag)
		if (!is_array($array)) {
			return FALSE;
		}
		else {
			foreach ($array as $v => $k) {
				if (ereg($flag, $k)) {
					return $k;
				}
			}
		}
	}
	
	function BaseServeur($uri) {
		//D: Fonction qui retourne la base d'une URI passée en paramétre
		//R: (uri_base)
		if (substr($uri,0,7) == "http://") { // si l'url posséde le http:// du début
			$url = split("/",$uri); // on coupe $url tout les /
			$url = $url[2]; // on prend le troisiéme
		}
		else {
			$url = split("/",$uri); 
			$url = $url[0];			
		}
		return "http://".$url; // on retourne l'url de base
	}
}

///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// Appel de la classe !
// Sans ca tout ce qu'il y a au dessus ne sert plus à rien :)
///////////////////////////////////////////////////////////////////////
$phpR = new PHPRewrite(); // Création de la classe
$phpR->OuvrirFichier(); // On ouvre le fichier et on voit si il est conforme à la config.
$phpR->RedirectUrl(); // Et hop, on redirige ...
?> 

 Conclusion

Voilà les différences entre le mod original et le script :
- Le mod_rewrite d'apache permet aussi des réécritures conditionelles (RewriteCond), le script ne le fait pas encore.
- Pour l'instant c'est tout ce que j'ai trouvé comme différences :)

Voilà les bugs qu'on peut trouver :
- Si le masque de sortie d'une page ne correspond à aucune page réélle, il n'y aura pas d'erreur 404, juste une page blanche (Je vais essayer de corriger ca au plus vite :)
- C'est tout aussi :)


Je suis toujours à la recherche de quelqu'un qui maitrise la réécriture d'url "évoluée" =)

Je bosse actuellement sur la prochaine version qui prend en compte les RewriteCond :)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

18 août 2005 13:07:33 :
- Modification de la description pour etre plus lisible ^^"
19 août 2005 09:56:17 :
Correction des erreurs "Warning" et "Notice" avec l'error_eporting(E_ALL)
19 août 2005 11:06:28 :
Modification d'une boucle (count($i) - 1 ---> $c = count($i) - 1;)
19 août 2005 11:10:25 :
Rajout d'un ; :)
20 septembre 2005 18:23:08 :
Changement vers la version 1.2, ajout de nouveaux flags gérés, et mise en classe. Nouvelles fonctionnalités : - Flag de "chainage" : Possibilité de "chainer" les RewriteRule avec le flag [C], l'url est réécrite une fois, et l'est ensuite avec toutes les RewriteRule positives suivantes jusqu'a rencontrer un flag [L] de fin de réécriture - Flags d'erreurs : [F] et [G] qui affichent respectivement une erreur 403 (Forbidden) et 410 (Gone). - Erreurs personnalisables : Les erreurs affichées peuvent etre personnalisées et etre en différentes langues. Les messages par défauts correspondent à ceux d'Apache. - Respect de la casse : La casse est désormais respectée, et peut etre désactivable avec une option de configuration du script, ou par ... - Flag NoCase [NC] permet de ne pas respecter la casse selectivement pour la régle qui posséde ce flag - Flag de redirection [R=XXX] ou [R] qui permet de rediriger une page avec un code d'erreur spécifique, 301 ou 302 par exemple (utile pour les robots). - Pas d'erreur rencontrée jusqu'à maintenant, faite m'en part :) - Les variables $_POST envoyées à l'url source sont retranscrites dans l'url réécrite.

 Sources de la même categorie

Source avec une capture MODULE JOOMLA 1.5 NOW LISTENING par Alcantornet
Source avec Zip Source avec une capture UPLOAD CENTER par basssem81
Source avec Zip COMPTEUR DE CLIQUE PHP AVEC JQUERY par devgoneti
Source avec Zip LIVRE D'OR SIMPLE (POUR DÉBUTANT) par devgoneti
Source avec Zip SCRIPT TRAVAUX POUR VOTRE SITE par FleuryK

 Sources en rapport avec celle ci

Source avec Zip CREATED SOME TINY URL par ledamss
VÉRIFICATION DES URL VALIDE AVEC PHP par dilar
REDIRECTION D'URL par bonhommecrea
CACHER SES LIENS DE L'URL par cod57
Source avec Zip NAVIGATION 404 - FLOPTWO par floptwo

Commentaires et avis

Commentaire de Shisui le 18/08/2005 14:20:25

Vu 28 fois et aucun commentaire ? :/ *snif*

Commentaire de Anthomicro le 19/08/2005 00:26:01

Salut,

"Ca n'est pas vraiment un bug mais le serveur de Free affiche des alertes et notices lorsque la page ne correspond à aucun masque, d'ou la présence de la ligne error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);"

à toi de le gérer pour que ça ne fasse pas ça, mets l'error_reporting à E_ALL

Sinon très bonne source, j'aime bien le principe et ça change du reste. 10/10 :-)

a +

Commentaire de Shisui le 19/08/2005 10:08:13

Merci, c'est encourageant pour la suite :)
Quant aux erreurs c'est réglé, j'ai rajouté quelques conditions et changé quelques petites choses (notemment au niveau des boucles et des fonctions) ce qui fait que plus aucune erreur n'apparait avec l'error_reporting à E_ALL :)
Voilà les changement :
Dans la fonction regle_info,
    if (count($regle) != 3) {
        return FALSE;
    }
a été rajouté pour éviter le passage de string qui ne sont pas des régles (condition minime mais ca évite des erreurs :) )

Dans la fonction url_rewrite :
   while ($i <= 9) {
   a été changé en while ($i <= count($vars) - 1) { (erreur de ma part :/) pour eviter les "Offset X undefined"

Dans le script, la boucle for : for ($i=0; $i <= $lignes_tot; $i++) a été changée (le script prenait une ligne en trop et ratait la premiére)

Voilà :) Si quelqu'un trouive d'autre bug qu'il le signale :)

Sinon je suis en train de passer le script en class, on m'a dit que ca accélérerait le script :)

Commentaire de Anthomicro le 19/08/2005 10:44:15

while ($i <= count($vars) - 1)

définit ton count() avant

$nb=count($vars);
while ($i < $nb)

Commentaire de Shisui le 19/08/2005 11:06:57

Voilà c'est corrigé mais qu'est ce que ca apporte ?

Commentaire de Anthomicro le 19/08/2005 11:11:18

plus de rapidité :-)

Commentaire de massacr le 19/08/2005 12:25:47

Très bonne source. Je ne me suis pour l'instant pas beaucoup intéréssé à l'URL REWRITING, je compte m'y intéréssé bientôt. Et ce genre de sources un à excellent intéret didactique. Merci
A+

Commentaire de Inekman le 20/08/2005 03:06:45

Complètement trop bien ce code. Bien commenté de surcroît.

Bravo.

Inekman.10/10.

Commentaire de aqw2003 le 28/08/2005 17:01:06

Tu n'aurais pas une astuce pour le redirection 301 ?

Commentaire de Shisui le 20/09/2005 18:27:39

Wala, nouvelle version du script, en classe cette fois ci et avec de nouvelles fonctionalités comme le chainage d'urls, la prise en charge de la casse, les redirections 301 / 302, les erreurs 403 Forbidden et 410 Gone, etc :)

Voili voulou dites moi ce que vous en pensez :)

Je me remet à bosser moi =) Je suis en train de faire les RewriteCond et ca a l'air d'avancer vite ^^

@++

Commentaire de madvic le 16/01/2006 16:22:51

Désolé mais moi je n'y arrive pas !!
J'ai bien mis mon code rewriting dans le fichier .rewritemod , mis dans .htaccess la ligne "ErrorDocument 404 /muscade/urlrewriting.php" sans les guillemets et rien ne se passe à par une erreur que j'ai corrigé :

Warning: Missing argument 2 for erreur() in g:\easyphp\www\muscade\urlrewriting.php on line 191

Warning: Cannot modify header information - headers already sent by (output started at g:\easyphp\www\muscade\urlrewriting.php:191) in g:\easyphp\www\muscade\urlrewriting.php on line 198

J'ai donc rajouté ="en" à l'argument 2 à la ligne 191 :
function erreur($num = "404",$langue ="en",$redir = FALSE) {

Voilà.

Commentaire de madvic le 16/01/2006 16:36:09

Je comprend, c'etais du conditionnel !
Est ce que le dev avance ? Chui impatient !

Commentaire de touxe le 29/01/2006 21:06:15

Vraiment tres bonne classe. Tres utiles. J'utilisais jusque maintenant isapirewrite pour IIS6 mais je crois que je vais utiliser ta classe. (Il faudrais que je teste la rapidité avec les deux solutions). Par contre je vais rajouter la possibilité de logger les réécritures qui sont effectuées comme dans le mod_rewrite ... tres pratique pour comprendre ce qu'il se passe quand ca ne marche pas.
J'attend la nouvelle version avec impatience.

Bon courage et encore une fois bon boulot !
Touxe

Commentaire de cz1702 le 02/02/2006 20:39:06

Tout d'abord félicitation pour ce code !! j'ai du faire quelque modification pour que ce script marche su free mais maintenant ça marche nickel !! Le seul problème est que les pages ne sont pas indexé sur google c'est peut être du au fait que le header reste 404 (vu avec http://tools.apocalx.com/entete-http/)!! Suis je le seul à avoir ces problèmes ???

Commentaire de Shisui le 28/02/2006 14:37:20

J'ai testé ça avec l'extesion LiveHttpHeaders de firefox et je reçois bien le header 200 OK

Quant à l'erreur citée plus haut elle est corrigée mais je n'ai pas mis à jour ici, et pour répondre à la question du dev je l'avais un peu oublié mais vu que ya du monde qui s'y interesse je vais surement m'y remettre :)

Commentaire de audayls le 24/04/2006 23:25:36

10/10 Il n'y a pas d'autre note pour cette exellente source ! Bonne chance pour la suite ^_^ ! En tout cas j'attends la mise à jour avec impatience :-P

Commentaire de audayls le 17/05/2006 21:16:39

Je n'arrive pas à utiliser ton code sur PHP4 (c'est dommage ...) Mais bon c'est quand même génial comme code ! XD

Commentaire de alahassarodriguez le 09/02/2008 11:29:01

Bonjour, voilà j'essaie d'utiliser le code de Shisui, mais j'obtiens comme erreur

The requested URL /International students/index_files/projets.html was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

Voilà ce que j'ai mis dans mon .rewritemod:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^projets\.html$ ../activites/activites.php [L]

et dans mon .htaccess:
ErrorDocument 404 /index_files/urlrewriting.php

Merci de votre aide!

Commentaire de heriquet le 15/07/2008 11:28:10

Excellent code ! Je vais l'utiliser...

Petite proposition d'amélioration...

Ne serait-il pas intéressant de mettre le code de la fonction "OuvrirFichier" dans un constructeur ?

De toute facon il sera appelé et il n'y a pas de paramètre...

Commentaire de jphilippev le 09/03/2009 18:47:38

salut c'est possible de configurer la réécriture genre de passer de page.php?produit=1 à chaussure-nike.php?? dsl pour la pub lol

Commentaire de moumous le 27/01/2011 12:57:51

Bonjour à tous

Ce script est vraiment intéressant notamment pour faire passer wordpress mu sur free. Néanmoins ca ne fonctionne pas. Voila le .htaccess de base pour wordpress mu :

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]


et Voila les deux modification quelques modifications approtées :

ligne 123 : include("http://".$_SERVER["HTTP_HOST"]."/".$this->getPageVars($this->url_sortie,"page"));
ligne 344 :if (!file_exists("http://".$_SERVER["HTTP_HOST"]."/".$_SERVER["REQUEST_URI"])) {
ligne 346 : }

et le rewritemod :
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]


Voila es que quelqu'un à une idée de pourquoi ca ne marche pas (page blanche !)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

URL Rewriting & .htaccess [ par dorian53 ] Bonjour,j'aimerais pouvoir tester l'URL Rewriting en local sur mon PC. Je suis sous ephp 1.7. Pour le moment j'ai laissé toutes les config par défaut, URL rewriting [ par Anthotill ] Bonjour &#224; tous !Je me tire les cheveux pour trouver un mod URL rewriting.sur ce site j'ai trouver ceci : http://www.phpcs.com/code.aspx?ID=33296& URL rewriting simple problème [ par bricethenetman ] Bonjour, je viens de trouver cette source http://www.phpcs.com/code.aspx?ID=33296&nbsp;mais je n'arrive pas &#224; la configurer (je d&#233;bute en ur url rewriting [ par LaurentKOogar ] Bonjourvoila, je voudrais faire une url rewriting sur un annauire qui a 12 000 pages index&#233;s dans GooglePas compliquer au niveau du rewriting ave URL Rewriting [ par masterofquebec ] Bonjour,J'ai fais une règle d'url rewriting.RewriteRule ^index-([^-/&amp;?$]+).html$  index.php?page=$1  [L]RewriteRule ^(.*).html $1.php [L]Elle marc Variables Url Rewriting [ par masterofquebec ] Bonjour, je souhaite récupérer l'url demandé par l'utilisateur dans (non l'url redirigé par le mode rewrite) en php.Il y a t'il une variable définie p URL rewriting [ par MadM@tt ] Bonjour à tous,Voilà j'ai mis en place de l'url rewriting.Une règle simple est que je redirige toute adresse de la formewww.monsite.com/abc/vers www.m Free rewriting url [ par abdoulax ] Bonjour,Je voudrais faire du rewriting url chez free. Jusque la aucun soucis, sauf que lorsque je tape une url dugenre http://monsite.free.fr/contact  url rewriting [ par Jackboy ] Bonjour !J'ai un probleme sur mon site, je fais un url rewriting sur mes pages, mais certaine page ne fonctionne pas, pourtant j'applique la même stru Url-rewriting: problème de variable [ par blaize21 ] Bonjour,j'essaye de mettre en place un système d'url-rewriting pour mon projet de fin d'année.Voici le code qui me permet de réécrire les liens de mes


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales