guest@6admin.io:~$

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/42 au 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.