Skip to content

Comprendre les blocs location de Nginx et leur impact sur la sécurité

Brandon Visca
Published date:

Le serveur web Nginx est reconnu pour sa performance et sa flexibilité. L’une de ses fonctionnalités clés est la directive location, qui permet de définir le comportement à adopter pour une URL ou un ensemble d’URL.

Bien utilisée, cette directive permet d’organiser proprement ses routes, d’améliorer la sécurité, et de simplifier la maintenance du serveur. Mal utilisée, elle peut introduire des failles de sécurité, provoquer des conflits entre règles, ou casser certaines fonctionnalités.

Dans cet article, nous allons explorer :


Qu’est-ce qu’un bloc location dans Nginx ?

Un bloc location permet de définir un comportement spécifique pour une requête HTTP en fonction de son URI. Il est souvent utilisé pour :

Exemple de base :

location /images/ {
    root /var/www/html;
}

location = /login { return 301 https://secure.monsite.com/login; }

2. location /chemin/

location /admin/ {
    auth_basic "Espace restreint";
}

location ^~ /static/ { root /var/www/assets; }

4. location ~ pattern

location ~ \.php$ {
    include fastcgi_params;
    ...
}

location ~* .(jpg|jpeg|png|gif|ico)$ { expires 7d; access_log off; }


Priorité des blocs location

Voici l’ordre d’évaluation des blocs location :

  1. location = /uri (exact)
  2. location ^~ /prefix
  3. location ~ /regex ou ~*
  4. location /prefix (générique)

Nginx applique le premier bloc qui correspond dans l’ordre ci-dessus.

Cela signifie que si plusieurs location peuvent correspondre à une requête, le bloc exact ou prioritaire sera appliqué même si une regex plus spécifique pourrait convenir.


Exemples d’utilisation avancée

Mutualiser plusieurs utilisateurs avec une regex

Imaginons un site éducatif avec un sous-dossier par utilisateur : /tamere, /tonpere, /tasoeur, etc.

Plutôt que de créer un bloc pour chacun, on utilise :

location ~ ^/([a-z0-9-]+)(/.*)?$ {
    root /home/app/htdocs;
    try_files $uri $uri/ /$1/index.php?$args;
}

location ~ .php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; }

Et pour éviter que des .php soient exécutés dans un répertoire public (ex. /uploads/) :

location ~* ^/uploads/.*\.php$ {
    deny all;
}

location ~ .php$ { … } location /admin/ { return 403; } ← Ignoré si /admin/index.php

✅ Solution : utiliser ^~ pour donner la priorité :

location ^~ /admin/ { return 403; }

location /images/ { alias /data/photos/; # Accède à /images/photo.jpg → /data/photos/photo.jpg }

root, lui, ajoute le chemin après l’URI.


Bonnes pratiques

location ~ /\.(ht|git|env|svn|project|idea) {
    deny all;
}

location /admin/ { add_header X-Frame-Options “DENY”; add_header Content-Security-Policy “default-src ‘none’;”; }


En résumé


Ressources complémentaires

Articles connexes

Previous
Aller plus loin : Permissions-Policy et protection anti-bots sur Nginx
Next
Limiter les risques sur Nginx : fichiers sensibles, uploads, méthodes HTTP