Aller au contenu

Nginx location : blocs, priorités et pièges de sécurité

Brandon Visca
Date de publication:

💡 TL;DR

  • Les blocs location de Nginx définissent le comportement du serveur selon l’URL demandée
  • Types de location, gestion des priorités et pièges de sécurité courants
  • Bien utilisés ils organisent tes routes ; mal utilisés ils ouvrent des failles

Table des matières

Table des matières

Nginx location : qu’est-ce qu’un bloc location ?

Un bloc location permet de définir un comportement spécifique pour une requête HTTP en fonction de son URI. C’est la brique sur laquelle reposent la plupart des règles de durcissement, des headers de sécurité au filtrage d’extensions. Il est souvent utilisé pour :

Exemple de base :

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

Cela signifie que toute URL commençant par /images/ sera servie depuis le répertoire /var/www/html/images.


Les différents types de blocs location

Nginx propose plusieurs syntaxes de location, chacune avec un comportement et une priorité différente.

1. location = /chemin

Exemple :

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

2. location /chemin/

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

3. location ^~ /chemin

Utile pour forcément servir des fichiers statiques, sans qu’une regex interfère.

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

4. location ~ pattern

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

5. location ~* pattern

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;
}

Cette regex :

Séparer les extensions

Pour traiter tous les fichiers .php :

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;
}

Erreurs fréquentes à éviter

❌ Mauvaise priorité

Avoir un bloc regex qui écrase un bloc statique :

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

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

location ^~ /admin/ { return 403; }

❌ Mauvais usage de alias vs root

Si tu utilises alias, n’oublie pas de retirer le chemin complet de la requête :

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;
}

Sécurité : ce que les blocs location peuvent protéger

Chacun de ces points est détaillé dans le guide dédié à la protection des fichiers sensibles et des uploads :

location /admin/ {
    add_header X-Frame-Options "DENY";
    add_header Content-Security-Policy "default-src 'none';";
}

En résumé


Ressources complémentaires

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