Apache : l'URL rewriting
mod_rewrite est le module d’Apache qui réécrit les URLs à la volée. Il transforme /article.php?id=42 en /article/42, redirige les vieux liens vers les nouveaux et fait tout ce qu’un reverse proxy ne fait pas: il modifie la requête avant qu’elle atteigne l’application.
Le basic
RewriteEngine On
RewriteRule ^article/([0-9]+)$ article.php?id=$1 [L]
Cette règle transforme /article/42 en article.php?id=42 en interne (l’utilisateur voit /article/42, Apache exécute article.php?id=42). Le [L] signifie “last rule”: si cette règle matche, les suivantes ne sont pas évaluées.
Les règles qui servent
# Forcer le www
RewriteCond %{HTTP_HOST} ^mondomaine.fr$
RewriteRule ^(.*)$ http://www.mondomaine.fr/$1 [R=301,L]
# Forcer le HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# Bloquer un user-agent
RewriteCond %{HTTP_USER_AGENT} sqlmap [NC]
RewriteRule .* - [F]
# Rediriger tout vers un index (pattern WordPress)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Les RewriteCond sont les conditions: si la condition matche, la RewriteRule suivante s’applique. Les flags: [R=301,L] = redirection permanente + dernière règle, [F] = forbidden (403), [NC] = no case.
Ce que ça sert
- URLs propres:
/article/42au lieu de/article.php?id=42, pour le SEO et la lisibilité; - Redirections massives: les vieux liens du site vers les nouveaux, sans toucher l’application;
- Le blocage: user-agents de scanners, méthodes HTTP interdites, IP sources;
- Le pattern “tout vers index.php”: c’est ce que fait WordPress, Drupal et tous les CMS PHP avec URL routing.
La conf se teste avec apachectl -t avant le restart, parce qu’une règle de rewrite cassée coupe tout le site.