Les .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.
- 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.
- [abcd] : Doit contenir obligatoirement ces lettres
- [^abcd] : le ^ correspond à NOT donc aucune de ces lettres
- (article|comments) : la barre | correspond à un OU et donc le texte peut être article ou comments.
- 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.
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
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
Je rectifie une erreur de saisie
l’adresse que je saisie est
http://unebonneoccasion.fr/article1508-z1000.html
pour un résultat identique
Not Found
The requested URL /article1508-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.