mars073 Posted July 22, 2014 Report Share Posted July 22, 2014 Bonjour à tous,Je vais vous expliquer comment faire plusieurs redirection interne grâce à un fichier .htaccess car oui on peut faire beaucoup de chose avec ce petit fichier (comme gérer les accès).On va commencer par quelque de simple: faire une page d'erreur, LA célèbre page "404 Not Found" (400 est le numéro de l'erreur, et "Not Found" signifie "non-trouvé").# Contexte: Notre gentil admin nous offre un accès pour faire notre site dans mon cas nous allons dire qu'il s'agit de "mars073.melinyel.net" mais lorsque l'on fait un lien vers un fichier inexistant (ex: [url=http://mars073.melinyel.net/monFichier.txt]http://mars073.melinyel.net/monFichier.txt[/url]) la redirection se fait sur [url=]"http://melinyel.net/error"[/url] alors je crée un fichier error.php et je veux que lorsque l'on veut afficher un fichier inexistant. #Syntaxe: ErrorDocument [n°_erreur] [fichier] ErrorDocument 404 ./error.php /!\ Attention : l'url du client ne va pas changer donc si vous avec un fichier à charger (ex: <img src="uploads/123.gif"> ou le css) et que le mauvais lien est "http://mars073.melinyel.net/ecrits/monFichier.txt" l'image sera cherché dans http://mars073.melinyel.net/ecrits/_uploads/123.gif. (à titre informatif l'erreur 403 est lorsque l'accès est refusé)Maintenant nous allons faire un peut plus compliqué, comme vous le voyez sur pas mal de boutique en ligne ou autre vous avez souvent des liens comme "http://mars073.melinyel.net/article-9986.html" mais pourtant si vous accédez aux dossiers vous ne verrez pas le fichier "article-9986.html", c'est normal, enfaite l'adresse que vous avez cherchez vous a envoyé une réponse en réécrivant l'accès en son entre.Dans mon cas (car mon cas est très intéressant </3) vous allons dire que j'ai fais un fichier du nom de "shop.php" et qu'il charge un article selon une variable GET du nom de "id" (c'est les données dans l'url), ce fichier se trouve dans un dossier du nom de "engine" à la racine du site et je veux donc créer un système comme expliqué au dessus.#Syntaxe: RewriteRule [lien_d'origine/regex] [lien_à_charger] #On autorise les liens symboliques: Options +FollowSymlinks #On active la réécriture de l’accès: RewriteEngine on #On donne notre regex et sa redirection: RewriteRule ^article-([0-9]+).html$ ./engine/shop.php?id=$1 Petite explication sur ce qu'est un regex (REGular EXpression ou expression régulière en français), c'est enfaite un motif, c'est à dire que l'on cherche une certaine syntaxe, dans l'exemple que j'ai donné au dessus on peut décomposer les élèments ainsi:- ^article- : celà commence par "article-"- () : récupérer la valeur entre les parenthèses qui est retourné dans $n (n = néme récupération)- [0-9]+ : celà contient des caractères de 0 à 9, le "+" symbolise que le caractère doit-être présent au moins une fois.- .html$ : celà termine par ".html"Nous allons monter d'un cran, cette fois-ci à la place d'avoir un nom.# premier cas nous n'autorisons que les caractères alphanumériques (a à z et 0 à 9) et le caractère "_" et nous allons le mettre insensible à la case ( ne pas faire la différence entre majuscule est minuscule). RewriteRule (?i)^article-([a-z0-9_]+).html$ ./engine/shop.php?name=$1 # deuxième cas nous autorisons tout les caractères même si il y en a aucun et nous rendons le caractère "-" qui se trouve juste avant RewriteRule (?i)^article?-(.*).html$ ./engine/shop.php?name=$1 le "(?i)" devant symbolise donc que la chaîne est insensible à la case.Vous voulez faire un système de page et donc vous écrivezRewrite (.*) ./index.php?p=$i Et surprise: 500 internal errorEn réalité le serveur va faire:#requête de base: http://mars073.melinyel.net/Accueil#première réécriture:http://mars073.melinyel.net/index.php?p=Accueil#deuxième réécriture:http://mars073.melinyel.net/index.php?p=index.php#troisième réécriture:http://mars073.melinyel.net/index.php?p=index.php...car comme vous l'avez spécifié que ça pouvait être une chaîne de n'importe quel caractère de n'importe quelle longueur donc "index.php" (les variables GET ne sont pas prissent en compte dans la réécriture) est une chaîne correct pour réécriture donc il va pas arrêter de la réécrire et vous afficher un message d'erreur comme quoi il s'agit d'une boucle infinie Il existe plusieurs solutions:#première solution: mettre un page/ en premier RewriteRule (?i)^page/(.+)$ ./index.php?p=$1 #deuxième solution: mettre les différentes pages existantes séparé par une barre ("|") RewriteRule (?i)^page/(accueil|boutique|contact)$ ./index.php?p=$1 # ou RewriteRule (?i)^(accueil|boutique|contact)$ ./index.php?p=$1 #troisième solution vous testez si le fichier existe et si ce n'est pas le cas il fait la redirection RewriteCond %{REQUEST_FILENAME} !-f #il ne faut pas que ça soit un fichier existant RewriteCond %{REQUEST_FILENAME} !-d #il ne faut pas que ça soit un dossier existant RewriteRule (.*) ./index.php?p=$1 Dans la dernière solution vous voyez "REQUEST_FILENAME" qui est une des nombre variable que l'on peur utiliser dans mon cas (en local) elle restourne "C:/xampp/htdocs/" puis le fichier/répertoire que j'ai entré dans l'url, vous pouvez aussi utiliser "REQUEST_URI" qui ne retourne que le répertoire/fichier entré dans l'url.Imaginons que maintenant vous voulez faire un système de sous page dedans donc page 1, 2, 3, 4, ... et vous mettez ce paramètre dans l'url donc http://.../ Accueil?page=2 (attention si vous mettez "p" comme non vous allez réécrire sur la variable faite dans le htaccess enfin vous pouvez toujours changer son nom pour une meilleur esthétique côté client)Comme vous le constaterez la variable n'est pas déclaré sur votre page après la réécriture, c'est normal vous devez ajouter un flag lors de la réécriture pour dire qu'il faut aussi donner les variable GET, il s'agit du flag ("drapeau" en français) QSA, ce qui va donner dans votre htaccess: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) ./index.php?p=$1 [QSA] Je pense que j'ai dis le principal à connaître si vous désirez faire un peu compliqué ou si vous cherchez plus d'info voici de la doc:- RewriteRule- Les flags/drapeauxJ'espère que mon tutoriel sera utile à quelqu'un,Bonne programmation à tous,Cordialement,Mars073. 1 Quote Link to comment Share on other sites More sharing options...
Azad Posted July 22, 2014 Report Share Posted July 22, 2014 Merci pour ce sujet sur le htaccess, il a une multitudes d'utilité pour un serveur web. Notamment, la protection des données ou l'URL Rewriting. +1 rep Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.