Aller directement au contenu
  • Catégories
  • Récent
  • Mots-clés
  • Populaire
  • Web
  • Utilisateurs
  • Groupes
Habillages
  • Clair
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Sombre
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Défaut (Aucun habillage)
  • Aucun habillage
Réduire
Melinyel

Melinyel

  1. Accueil
  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

Planifié Épinglé Verrouillé Déplacé Content System Manager (C.M.S.)
2 Messages 2 Publieurs 3.4k Vues
  • Du plus ancien au plus récent
  • Du plus récent au plus ancien
  • Les plus votés
Répondre
  • Répondre à l'aide d'un nouveau sujet
Se connecter pour répondre
Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
  • mars073M Hors-ligne
    mars073M Hors-ligne
    mars073
    a écrit sur dernière édition par
    #1

    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:

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

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

    Bonne programmation à tous,

    Cordialement,

    Mars073.

    votes-45296e7.png

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

    1 réponse Dernière réponse
    1
    • AzadA Hors-ligne
      AzadA Hors-ligne
      Azad
      a écrit sur dernière édition par
      #2

      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

      Administrateur du forum.

      Contactez-moi par message privé ou par mail.

      1 réponse Dernière réponse
      0

      Bonjour ! Vous semblez intéressé par cette conversation, mais vous n’avez pas encore de compte.

      Marre de refaire défiler les mêmes messages ? Créez un compte pour retrouver votre position, recevoir des notifications des nouvelles réponses, sauvegarder vos favoris et voter pour les messages que vous appréciez.

      Grâce à votre participation, ce message peut devenir encore meilleur 💗

      S'inscrire Se connecter
      Répondre
      • Répondre à l'aide d'un nouveau sujet
      Se connecter pour répondre
      • Du plus ancien au plus récent
      • Du plus récent au plus ancien
      • Les plus votés


      • Se connecter

      • Connectez-vous ou inscrivez-vous pour faire une recherche.
      Powered by NodeBB Contributors
      • Premier message
        Dernier message
      0
      • Catégories
      • Récent
      • Mots-clés
      • Populaire
      • Web
      • Utilisateurs
      • Groupes