Aller au contenu

Re-écrire des adresses grâce à un fichier .htaccess


Recommended Posts

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 écrivez

Rewrite (.*) ./index.php?p=$i
Et surprise: 500 internal error

En réalité le serveur va faire:

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/drapeaux

J'espère que mon tutoriel sera utile à quelqu'un,

Bonne programmation à tous,

Cordialement,

Mars073.

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Vous avez collé du contenu avec mise en forme.   Supprimer la mise en forme

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Chargement
 Share

×
×
  • Créer...