Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. Programmation
  3. Développement web
  4. Content System Manager (C.M.S.)
  5. Re-écrire des adresses grâce à un fichier .htaccess

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

Scheduled Pinned Locked Moved Content System Manager (C.M.S.)
2 Posts 2 Posters 3.4k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • mars073M
    mars073M
    mars073
    wrote on last edited by
    #1

    <p>Bonjour à tous,</p><p>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).</p><p></p><p>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é").</p><p></p><pre class="ipsCode prettyprint"># 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
    </pre><span style="color:#FF0000;"><strong>/!\ Attention :</strong></span> 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 "<a href="http://mars073.melinyel.net/ecrits/monFichier.txt" rel="external nofollow">http://mars073.melinyel.net/ecrits/monFichier.txt</a>" l'image sera cherché dans <a href="http://mars073.melinyel.net/ecrits/_uploads/123.gif" rel="external nofollow">http://mars073.melinyel.net/ecrits/_uploads/123.gif</a>. (à titre informatif l'erreur 403 est lorsque l'accès est refusé)<p></p><p>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 "<a href="http://mars073.melinyel.net/article-9986.html" rel="external nofollow">http://mars073.melinyel.net/article-9986.html</a>" 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.</p><p></p><p>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.</p><p></p><pre class="ipsCode prettyprint">#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
    </pre>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:<p>- ^article- : celà commence par "article-"</p><p>- () : récupérer la valeur entre les parenthèses qui est retourné dans $n (n = n<sup>éme</sup> récupération)</p><p>- [0-9]+ : celà contient des caractères de 0 à 9, le "+" symbolise que le caractère doit-être présent au moins une fois.</p><p>- .html$ : celà termine par ".html"</p><p></p><p>Nous allons monter d'un cran, cette fois-ci à la place d'avoir un nom.</p><p></p><pre class="ipsCode prettyprint"># 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
    </pre>le "(?i)" devant symbolise donc que la chaîne est insensible à la case.<p></p><p>Vous voulez faire un système de page et donc vous écrivez</p><p></p><pre class="ipsCode prettyprint">Rewrite (.
    ) ./index.php?p=$i
    </pre>Et surprise: 500 internal error<p>En réalité le serveur va faire:</p><blockquote class="ipsQuote" data-ipsquote=""><div><p>#requête de base: <a href="http://mars073.melinyel.net/Accueil" rel="external nofollow">http://mars073.melinyel.net/Accueil</a></p><p>#première réécriture:</p><p><a href="http://mars073.melinyel.net/index.php?p=Accueil" rel="external nofollow">http://mars073.melinyel.net/index.php?p=Accueil</a></p><p>#deuxième réécriture:</p><p><a href="http://mars073.melinyel.net/index.php?p=index.php" rel="external nofollow">http://mars073.melinyel.net/index.php?p=index.php</a></p><p>#troisième réécriture:</p><p><a href="http://mars073.melinyel.net/index.php?p=index.php" rel="external nofollow">http://mars073.melinyel.net/index.php?p=index.php</a></p><p>...</p></div></blockquote>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 😞 <p></p><p>Il existe plusieurs solutions:</p><p></p><pre class="ipsCode prettyprint">#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
    </pre>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.<p></p><p>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 <a href="/" rel="external nofollow">http://.../</a> 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)</p><p>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:</p><p></p><pre class="ipsCode prettyprint">
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.
    ) ./index.php?p=$1 [QSA]
    </pre>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:<p>- <a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule" rel="external nofollow">RewriteRule</a></p><p>- <a href="http://httpd.apache.org/docs/current/rewrite/flags.html" rel="external nofollow">Les flags/drapeaux</a></p><p></p><p>J'espère que mon tutoriel sera utile à quelqu'un,</p><p>Bonne programmation à tous,</p><p>Cordialement,</p><p>Mars073.</p>

    Aide à l'apprentissage et la réalisation pour des graphismes, des programmes, des sites ou autres.Signature aléatoire, proposez vous aussi une signature ici!

    1 Reply Last reply
    1
    • AzadA
      AzadA
      Azad
      wrote on last edited by
      #2

      <p>Merci pour ce sujet sur le htaccess, il a une multitudes d'utilité pour un serveur web. 🙂 <br/>
      Notamment, la protection des données ou l'URL Rewriting.<br/><br/>
      +1 rep</p>

      Administrateur du forum.
      Contactez-moi par message privé ou par mail.

      1 Reply Last reply
      0

      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

      With your input, this post could be even better 💗

      Register Login
      Reply
      • Reply as topic
      Log in to reply
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes


      • Login

      • Login or register to search.
      Powered by NodeBB Contributors
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • World
      • Users
      • Groups