Accueil > > > 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
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 :)
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
Commentaires et avis
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 à 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 mais je n'arrive pas à la configurer (je débute en ur
url rewriting [ par LaurentKOogar ]
Bonjourvoila, je voudrais faire une url rewriting sur un annauire qui a 12 000 pages indexé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-([^-/&?$]+).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
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|