Htaccess et url rewriting pour les nuls (1/2)

Htaccess et Url RewritingLes .htaccess sont très utilisés pour la création de site internet ce qui permet de gérer les réécritures d’url, mais aussi par exemple se protéger d’attaques ou des techniques comme le hotlinking. Un rappel des fonctionnalités à travers ce petite billet pour les débutants ou les confirmés du développement web.

Url Rewriting

La fonctionnalité qui est le plus utilisé actuellement est la réécriture d’url à travers le htaccess, qui permet de créer de jolies url qui seront compris par le serveur Apache.

Ce qui remplacera nos vieilles url du type

www.monsite.com/news.php?id=12 par une belle url www.monsite.com/htaccess-pour-les-nuls.html

Configuration

Sans passer les détails de la configuration de modules apache(mod_rewrite) vous aller commencer votre htaccess par deux lignes

RewriteEngine On
RewriteBase /

Tout d’abord activer la réécriture d’Url et ensuite indiquer le chemin ou se situe le fichier htaccess ce qui permettra de pouvoir travailler avec plusieurs htaccess dans plusieurs dossiers, pratique pour travailler en local sur plusieurs sites sans regrouper dans 1 seul htaccess. De plus dans le même principe qu’en codant on déclare une constante dans une variable en cas de changement, on indique le dossier ou se situe le site et on pourra en changer cette ligne déplacer son site dans n’importe quelle arborescence.

La réécriture

Nous allons maintenant voir les règles de syntaxe pour réécrire des urls

Elle ont souvent la forme

RewriteRule ^article([0-9]?)-[a-z0-9_-]*\.html$ news.php?id=$1 [L,NC]

Quelques explications

RewriteRule: On indique que la règle sera une réécriture d’url

(^) ($) marque respectivement le début et la fin de l’url. Dans notre cas l’url sera de la forme www.monsite.com/article[....] .html

Ensuite les regexp ( expression régulière ) indiquent la forme qu’aura une chaine de caractère.

[0-9] ne peut contenir que des chiffres

[a-z0-9_-] chaine autorisant des caractères de a à z, des chiffres ainsi que le caractère _(underscore) et -(tiret)

Exemples:

Notre url pourront donc être

www.monsite.com/article99-super-test_non.html

www.monsite.com/article9-super-test-du-92.html

Quelques Regexp

() est utilisé pour enregistré le contenu du regexp, dans notre exemple ([0-9]?) contient l’id de l’article, il sera transmis au serveur apache par la variable $1.

Après chaque regexp on peut indiquer le nombre de fois que le schéma se répètera

  • + : 1 ou N fois
  • * : 0 ou N fois
  • ? : 0 ou 1 fois

Ce qui signifie que notre url pourra ou non ( 0 ou 1 fois) contenir un id d’article.

  1. Le point . veut dire n’importe quel caractère, en indiquant .* il pourra y avoir n’importe quel caractère et autant de fois que l’on veut. Utile quand on ne sait pas ce que la chaine peut contenir.
  2. [abcd] : Doit contenir obligatoirement ces lettres
  3. [^abcd] : le ^ correspond à NOT donc aucune de ces lettres
  4. (article|comments) : la barre | correspond à un OU et donc le texte peut être article ou comments.
  5. pour échapper des caractères comme le . il faut utiliser l’anti-slash \ . En effet, le . ne sera pas considéré comme n’importe quelle caractère ( règle 1) mais comme le caractère .

La redirection

Nous avons notre belle url, il faut maintenant indiquer au serveur Apache ou rediriger la requête, et le cas échéant à la page news.php .

Pour cela il suffit tout simplement d’indiquer le chemin de la page par rapport au chemin du rewrite base,

A la racine

news.php?id=$1

Dans un dossier

pages/news.php?id=$1

Ensuite indiquons les paramètres qui sont dans notre cas l’id. Dans la première partie de la règle nous avons mis ([0-9]?) qui correspond à l’endroit ou l’id se situera. Le contenu sera assigné dans la variable $1 grâce aux parenthèses. Il suffit tout simplement d’incrémenter la variable selon le positionnement des (). Sur votre page il vous suffira de faire un $_GET["id"] ( en vous rappelant de toujours vérifier les données venant de l’utilisateur)

RewriteRule ^article([0-9]?)-commentaires([0-9]?)-[a-z0-9_-]*\.html$ news.php?id=$1&com=$2 [L,NC]

Flags ou drapeau utiles

Les flags sont les instructions en fin de ligne entre [], il est possible d’en mettre plusieurs.

[L] : si l’url correspond à la règle alors la suite du htaccess ne sera pas interprété

[NC] : n’est pas soumis à la casse, que ce soit minuscule ou majuscule, l’interprétation sera la même.

[QSA] : autoriser d’avoir des paramètres GET à la suite. Il sera inutile de prévoir de coder une réécriture pour une url rajoutant PHPSID à la fin de l’url par exemple

Plus de flags sur la doc apache

La redirection

Il est aussi possible de générer des redirections via les htaccess sans trop s’embetter.

RewriteCond %{HTTP_HOST} !^www\.monsite\.com$ [NC]
RewriteRule ^(.*) http://www.monsite.com/$1 [QSA,L,R=301]

Si l’url est www.monsite.net ou monsite.com ( sans le www)  on redirige vers l’adresse souhaité qui est dans notre cas www.monsite.com. Vous découvrez le nouveau flag R=301 qui rediriger le contenu via une 301.

Vous pouvez aussi utiliser pour une migration de nom de domaine la redirection suivante

RedirectMatch permanent ^/(.*)$ http://www.your-new-site.com/$1

Vous faites une maintenance ? Envie d’empêcher l’accès à votre site aux visiteurs autre que vous ? Rien de plus simple

RewriteCond %{REMOTE_ADDR} !^92\.12\.20\.45
RewriteRule $ /maintenance.php [R=302,L]

Quelques variables globales ( similaires à $_SERVER en php )

  • %(HTTP_USER_AGENT) ==> Contient notemment le naviguateur et le système d’ exploitation
  • %(HTTP_REFERER) ==> La page  d’ ou vient votre visiteur
  • %(HTTP_HOST) ==> Le domaine
  • %(REQUEST_FILENAME) ==> La page qui a été demandée
  • %(REMOTE_ADDR) ==> L’ adresse IP

La sécurité

Dans le prochain billet, un peu de sécurité avec votre htaccess.

Ce contenu a été publié dans Non classé par pierre. Mettez-le en favori avec son permalien.

3 réflexions au sujet de « Htaccess et url rewriting pour les nuls (1/2) »

  1. Bonjour.

    Le paragraphe de la redirection n’est pas clair en particulier ce qui concerne l’explication des 2 lignes :
    RewriteCond %{HTTP_HOST} !^www\.monsite\.com$ [NC]
    RewriteRule ^(.*) http://www.monsite.com/$1 [QSA,L,R=301]

    Est il possible de préciser les explications ?

    Merci

  2. Bonjour,

    Malgré un article très clair, je n’arrive pas à mettre en oeuvre l’url rewiting
    Une des adresses concernées:
    http://unebonneoccasion.fr/viewlisting.php?view=1508
    le titre de l’annonce est z1000

    J’ai donc mis dans mon .htaccess

    RewriteRule ^article([0-9]?)-[a-z0-9_-]*\.html$ viewlisting.php?id=$1 [L,NC]

    Lorsque je saisie
    http://unebonneoccasion.fr/annonce1508-z1000.html

    Ca me retourne:
    Not Found

    The requested URL /annonce1508-z1000.html was not found on this server.

    Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

    Ou ai-je fais une erreur?

    Merci pour votre aide

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>