Aller au menu - Aller au contenu

Icône Simuler l'URL rewriting avec l'erreur 404

Mise à jour : 22/08/2008
62 visites depuis 7 jours , classé 650/777
Dans ce tutoriel, je vais vous apprendre à simuler l'URL rewriting.
Il y a déjà un tutoriel sur ce site qui traite de ce sujet (celui-ci) mais ici, je vais utiliser une technique un peu plus particulière qui utilise un fichier .htaccess et l'erreur 404.
L'intérêt de cette technique est qu'elle peut marcher sur des serveurs qui n'autorisent pas l'URL rewriting classique.

Bonne lecture. ;)

Comment allons-nous procéder ?

Nous allons utiliser l'erreur 404 !
C'est l'erreur signifiant que le fichier auquel le visiteur a tenté d'accéder n'existe pas. ^^

Pour ce tutoriel, vous avez besoin d'un hébergeur qui accepte les fichiers .htaccess et les commandes du type :
Code : Apache
1
ErrorDocument 404 /erreur404.php

Pour en savoir plus sur cette commande, il y a un tutoriel : page d'erreur perso.

Nous allons donc dire à Apache que, lorsqu'un fichier n'est pas trouvé, on redirige vers une page qui va décortiquer l'adresse demandée pour inclure le bon fichier.

Par exemple...

Code : Autre
1
http://www.monsite.com/objet.php?obj=livre

... deviendra...

Code : Autre
1
http://www.monsite.com/objet-livre.html

... ou encore...

Code : Autre
1
http://www.monsite.com/objet/livre.html


La classe, non ? ;)

Allez, on commence par créer les fichiers dont on aura besoin avant de tester si ça peut marcher ou courir sur le serveur que vous utiliserez. :)

Tester la redirection en cas d'erreur

Donc, on aura besoin :
  • à la racine de votre site :
    • d'un fichier .htaccess,
    • d'un fichier index.php pour la redirection,
  • et où vous le souhaitez :
    • de tous vos fichiers (ici, je n'utiliserai qu'un fichier objet.php).


Le fichier index.php



Créez un fichier index.php dans lequel vous écrirez :

Code : PHP
1
Youpi, ça marche !

Vous verrez ensuite pourquoi. ^^

Le fichier .htaccess



Créez maintenant un fichier .htaccess dans lequel vous mettrez ceci :

Code : Apache
1
ErrorDocument 404 /index.php

Cela aura pour action, si un fichier n'est pas trouvé, de rediriger le visiteur vers le fichier index.php.

Testons...



Maintenant, allez sur une page qui n'existe pas sur votre site.
Exemple :

Code : Autre
1
http://www.monsite.com/page_qui_n_existe_pas.html


Si vous voyez écrit « Youpi ça marche ! » et que l'adresse dans la barre d'adresse de votre navigateur est toujours l'adresse du fichier qui n'existe pas, vous pouvez continuer à lire, sinon DEHORS !
Non, je rigole, vous pouvez rester mais bon, ça ne fonctionnera pas ! ^^

Exemple où tout est bon :

Image utilisateur


Allez hop, on passe à la réalisation du système. :)

Le système

Alors, ici, mes URL seront du type :

Code : Autre
1
http://www.monsite.com/objet/livre.html


Commencez par effacer « Youpi ça marche ! » du fichier index.php.
On va donc coder le système de redirection dans index.php.

On commence par récupérer l'adresse qui a été demandée avec $_SERVER['REQUEST_URI'] et on va la « nettoyer » puis la découper :

Code : PHP
1
2
3
4
<?php
$adresse1 = trim(str_replace('.html', '', $_SERVER['REQUEST_URI']), '/').'/';
$adresse = explode('/', $adresse1);
?>


Ce bout de code aura pour action de transformer /objet/livre.html en objet/livre puis de créer un tableau découpé en fonction des /.

Je fais mes tests dans le dossier tuto_ur/ donc mes URL, une fois nettoyées, seront du type tuto_ur/objet/livre. Il va par conséquent falloir ne pas tenir compte de tuto_ur/, pour ça, on va tout simplement définir une constante qui stocke le numéro de la première donnée que l'on peut extraire du tableau de l'URL :

Code : PHP
1
2
3
<?php
define('FIRST_DATA_URL', 1);
?>

N'oubliez pas que le premier élément d'un tableau n'est pas le 1 mais le 0. ;)

On va donc récupérer le nom de la page :

Code : PHP
1
2
3
<?php
$page = $adresse[FIRST_DATA_URL];
?>


Puis on va inclure cette page :

Code : PHP
1
2
3
4
5
<?php
if(file_exists('./'.$page.'.php') AND $page != 'index') {
	include('./'.$page.'.php');
}
?>


Je mets AND $page != 'index' afin de ne pas inclure à nouveau le fichier index.php, ce qui créerait une boucle infinie.


Vous pouvez ajouter ce qui suit. ;)

Code : PHP
1
2
3
4
5
6
<?php
else {
	echo 'Ce fichier n\'existe pas !'; // Revient à une erreur 404 
	exit();
}
?>


Maintenant, créez une page objet.php dans laquelle vous mettrez le code :

Code : PHP
1
2
3
<?php
echo 'Je suis la page objet et j\'ai un cadeau pour vous : un '. $adresse[FIRST_DATA_URL+1];
?>


Voilà ce que j'obtiens :

Image utilisateur


Essayez de changer livre.html en ordinateur.html, ça fait encore plus plaisir ! ^^

Attention, ce script n'est pas sécurisé à 100 %, c'est pourquoi je vous conseille la lecture de ce tutoriel afin de ne pas risquer de vous faire pirater votre site.

Les codes complets

Le fichier .htaccess



Code : Apache
1
ErrorDocument 404 /index.php


Le fichier index.php



Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
$adresse1 = trim(str_replace('.html', '', $_SERVER['REQUEST_URI']), '/').'/';
$adresse = explode('/', $adresse1);
define('FIRST_DATA_URL', 0);
$page = $adresse[FIRST_DATA_URL];

if(file_exists($page.'.php') AND $page != 'index') {
	include($page.'.php');
}
else {
	echo 'Fichier introuvable';
	exit();
}
?>


Le fichier objet.php



Code : PHP
1
2
3
<?php
echo 'Je suis la page objet et j\'ai un cadeau pour vous : un '. $adresse[FIRST_DATA_URL+1];
?>
Une fois que vous avez compris le principe, vous pouvez très bien créer des URL du type :

Code : Autre
1
http://www.monsite.com/blog/2008/06/07/1-nom-de-l-article.html


Dans ce cas, supposons que 1 soit l'ID de l'article et que nom-de-l-article soit de la décoration, vous devrez faire :

Code : PHP
1
2
3
4
<?php
$infos = explode('-', $adresse[FIRST_DATA_URL+4]);
$id_de_larticle = $infos[0];
?>


Ça fait tout de suite plus pro ! :)

Si vous avez des questions, vous pouvez me les poser par MP !

@+

P.S. — Je tiens à remercier les zCorrecteurs Guill@ume et Whitecoyote pour leur zCorrection rapide et efficace.

Image utilisateur

Partager

18 commentaires pour "Simuler l'URL rewriting avec l'erreur 404"
Note moyenne : 3.15 / 4 (13 votes)
Pseudo Commentaire
Hors ligne Kappaw. # Posté le 19/06/2008 à 19:46:40
No rage :)
Avatar

Ville : Arlon
Pays : Belgique

Salut,

Pas mal le tutoriel, mais dommage pour les $_POST.

Sinon je me demandais comment les liens interne était fait dans un système pareil :
Code : HTML
1
<a href="objet.php?obj=livre" alt=""> </a>

ou
Code : HTML
1
<a href=objet-livre.html" alt=""> </a>

?

Merci d'avance.

Thibault @ Kappaw.
 
Hors ligne titouille56 # Posté le 19/06/2008 à 20:21:34
Controlling Crowds
Avatar
Flux RSS

Ville : Lanester
Pays : France métropolitaine

Ba pour le premier ça change pas : c'est une page PHP classique et pour l'autre, c'est avec le explode que tu ne dois pas couper avec un / mais avec un - (c'est expliqué à la fin du tutoriel).
 
Hors ligne Kappaw. # Posté le 19/06/2008 à 22:15:01
No rage :)
Avatar

Ville : Arlon
Pays : Belgique

Ah ouai sorry :) .

Thibault @ Kappaw.
 
Hors ligne NeoZer0 # Posté le 17/07/2008 à 10:43:25
Nostalgeek
Avatar

Autre le faite qu'il manque les headers 200 pour éviter que les bots ne référence pas les pages, il aurait était judicieux de faire un système qui permette de mettre toutes ses régles de rewrite. Comme ette fonction que j'ai créer et posté il y a un moment sur le forum PHPCode : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
function rewriting()
{
        $fichier_conf = '.htrewriterules';
        $page_erreur = '404.php';
        $url = substr_replace($_SERVER['REQUEST_URI'],'',0,1);
        $open = fopen($fichier_conf,"r");
		while(!feof($open)){
			$rules = fgets($open,filesize($fichier_conf));
			$masque = explode('|',$rules);
			$url_finale = $masque[1];
			preg_match('`'.$masque[0].'`U',$url,$ereg);
			if(isset($ereg[0])){
					$i =0;
					$count = count($ereg);
					while($i <= $count -1){
						$url_finale = str_replace("$".$i,$ereg[$i],$url_finale);
						$i++;
					}
					$url_finale = str_replace(array("\r","\n"),'',$url_finale);
					$parse_url = parse_url($url_finale);
					if(isset($parse_url['query']))
					{
							$varget = $parse_url['query'];
							$varget = explode("&",$varget);
							foreach($varget as $varval)
							{
									$varval = explode("=",$varval);
									$_GET[$varval[0]] = $varval[1];
							}
					}
					header("HTTP/1.1 200 OK");
					header("Status: 200 OK");
					include($parse_url["path"]);
					exit;
			}
		}
        include($page_erreur);
}
?>

Le fichier de qui contient les règles ressemble à ceci
Code : Apache
1
2
^index.html$|index.php
^index-p([0-9]+).html$|index.php?page=$1

La seule chose avec ce genre de système c'est qu'il faut faire attention avec ses includes qui ne sont inclus directement depuis la page de rewriting.

Edit: cette fonction peut être améliorer on peux remplacer le | par un espace aussi pour être plus proche de la syntaxe du mod rewrite

n'oubliez pas de Image utilisateur ;)
 
Hors ligne arkang3l # Posté le 01/09/2008 à 14:33:41
Smoke w**d everyday ;)
Avatar

Je ne met que 15 car cette technique ne conserve pas les variables transmises par POST.
Si quelqu'un pouvait m'expliquer le code de Dutonia...

Voir tous les commentaires
Ce tutoriel a été corrigé par les zCorrecteurs.