Transformer et Rediriger vos Requêtes
La réécriture d'URL, ou "Rewrites", est une fonctionnalité puissante de Nginx. Elle permet de modifier une adresse web (URL
) avant même que Nginx ne traite la requête. On peut ainsi transformer l'URL demandée par le client ou le rediriger vers une nouvelle adresse.
Ce processus s'appuie sur des expressions régulières, des motifs complexes qui identifient des séquences spécifiques dans les URLs. Cela offre une flexibilité immense pour manipuler les chemins d'accès ou les paramètres, rendant la gestion des requêtes très fine.
En somme, les Rewrites sont un outil de transformation et de redirection. Ils agissent comme un filtre intelligent qui adapte les URLs en temps réel pour divers objectifs, avant que la ressource finale ne soit servie par le serveur.
SEO : URLs claires et conviviales
Les rewrites sont essentiels pour le référencement (SEO). Ils transforment vos URL techniques ou complexes en adresses claires, descriptives et faciles à retenir. Cela améliore la lisibilité pour les utilisateurs et le classement dans les moteurs de recherche, qui privilégient les URLs "propres".
Cas d'Utilisation : Votre site affiche monsite.com/produit.php?id=123
. Vous voulez une URL SEO-friendly comme monsite.com/produit/tablette-tactile
.
Exemple de Configuration Nginx :
server {
listen 80;
server_name monsite.com;
location / {
# Réécrit l'URL propre en interne vers le script PHP original
# Capture le nom du produit (ex: tablette-tactile) et l'ID (ex: 123)
rewrite ^/produit/([a-z0-9-]+)-(\d+)$ /produit.php?id=$2&slug=$1 last;
root /var/www/monsite;
index index.html index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
}
}
Explication
rewrite ^/produit/([a-z0-9-]+)-(\d+)$ /produit.php?id=$2&slug=$1 last;
: Cette directive capture le slug et l'ID du produit depuis l'URL "propre" et les réécrit vers l'URL interne avec paramètres.$1
correspond au slug (ex:tablette-tactile
) et$2
à l'ID (ex:123
). Le flaglast
signifie que Nginx doit cesser de traiter d'autres règles de réécriture et chercher une correspondance avec la nouvelle URL.
Sécurité : Bloquer les requêtes malveillantes
Les rewrites offrent une première ligne de défense contre certaines attaques. Ils permettent de bloquer ou rediriger des requêtes suspectes basées sur des motifs spécifiques dans l'URL ou la chaîne de requête, protégeant ainsi votre serveur des tentatives d'intrusion basiques.
Cas d'Utilisation : Vous souhaitez bloquer l'accès aux requêtes qui contiennent des tentatives d'injection SQL simples ou des chemins d'accès sensibles non autorisés.
Exemple de Configuration Nginx :
server {
listen 80;
server_name votre_site.com;
# Bloque les requêtes contenant des patterns d'injection SQL basiques
if ($query_string ~* "union select|information_schema") {
return 403; # Accès interdit
}
# Interdit l'accès direct aux dossiers .git (souvent exposés par erreur)
location ~ /\.git/ {
deny all;
return 403; # Accès interdit
}
# ... autres configurations de votre site ...
}
Explication
if ($query_string ~* "union select|information_schema") { return 403; }
: Cette condition vérifie si la chaîne de requête ($query_string
) contient les motifsunion select
ouinformation_schema
(insensible à la casse,~*
). Si un motif est trouvé, Nginx renvoie un statut403 Forbidden
, bloquant la requête.location ~ /\.git/ { deny all; return 403; }
: Ce bloclocation
utilise une expression régulière (~
) pour intercepter toute requête vers un dossier.git
.deny all;
interdit tout accès, etreturn 403;
assure que le client reçoit une erreur explicite.
Migration : Assurer la continuité des liens
Lors d'une migration de site, les rewrites sont vitaux. Ils permettent de rediriger les anciens liens vers les nouvelles structures d'URL, évitant ainsi les erreurs 404. C'est crucial pour maintenir le trafic des moteurs de recherche et assurer une transition fluide pour les utilisateurs.
Cas d'Utilisation : Vous avez déplacé tous vos articles de monsite.com/old-articles/id_article.html
vers monsite.com/blog/nouvel-article-slug
.
Exemple de Configuration Nginx :
server {
listen 80;
server_name monsite.com;
location / {
# Redirection permanente des anciennes URLs d'articles
# Capture l'ID de l'ancien article et le redirige vers un chemin dynamique
rewrite ^/old-articles/(\d+)\.html$ /blog/nouvel-article-$1 permanent;
# ... autres configurations ...
}
}
Explication
rewrite ^/old-articles/(\d+)\.html$ /blog/nouvel-article-$1 permanent;
: Cette directive intercepte les URLs de l'ancienne structure (/old-articles/ID.html
). L'expression régulière(\d+)
capture l'ID de l'article. La requête est ensuite redirigée de manière permanente (permanent
, statut 301) vers la nouvelle URL propre, en utilisant l'ID capturé ($1
).
Canonicalisation : Forcer une URL unique
La canonicalisation, gérée par les rewrites, assure que chaque page de votre site n'est accessible que via une seule et unique URL. Cela est crucial pour le SEO afin d'éviter le "duplicate content" et pour la cohérence de l'expérience utilisateur, par exemple en forçant le HTTPS ou l'utilisation du www
.
Cas d'Utilisation : Vous voulez que toutes les requêtes vers http://votresite.com
et http://www.votresite.com
soient redirigées vers https://www.votresite.com
.
Exemple de Configuration Nginx :
server {
listen 80;
server_name votresite.com www.votresite.com;
return 301 https://www.votresite.com$request_uri; # Redirection HTTP vers HTTPS et force le www
}
server {
listen 443 ssl;
server_name votresite.com; # Gère les requêtes HTTPS sans www
return 301 https://www.votresite.com$request_uri; # Redirige vers HTTPS avec www
}
server {
listen 443 ssl;
server_name www.votresite.com; # Le Virtual Host principal et canonical
# ... configuration SSL, root, index, etc. pour votre site ...
}
Explication
Premier bloc server
(port 80) :
listen 80;
: Écoute les requêtes HTTP.server_name votresite.com www.votresite.com;
: Intercepte les requêtes pour les deux versions du domaine (avec et sanswww
).return 301 https://www.votresite.com$request_uri;
: Effectue une redirection permanente (301) vers la version HTTPS avecwww
.$request_uri
conserve le chemin et les paramètres de l'URL originale.
Deuxième bloc server
(port 443 sans www) :
listen 443 ssl; server_name votresite.com;
: Intercepte les requêtes HTTPS sanswww
.return 301 https://www.votresite.com$request_uri;
: Redirige vers la version HTTPS avecwww
pour garantir l'URL unique.
Troisième bloc server
(port 443 avec www) :
- C'est ici que se trouve la configuration principale de votre site web, car c'est la version canonique (
https://www.votresite.com
).