Aller au contenu

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

Nginx location : types de blocs, ordre de priorité, regex et pièges de sécurité. Guide complet avec des exemples de configuration testés.

Date de publication:
4 min de lecture

💡 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 :

  • Servir des fichiers statiques
  • Rediriger vers un script PHP
  • Appliquer des règles de sécurité ou des headers
  • Déléguer à un proxy (ex: PHP-FPM, Node.js, etc.)

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

  • Correspondance exacte
  • Priorité maximale
  • Pratique pour /favicon.ico, /robots.txt, etc.

Exemple :

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

2. location /chemin/

  • Correspondance préfixée
  • Le plus général
  • Priorité inférieure aux autres
location /admin/ {
    auth_basic "Espace restreint";
}

3. location ^~ /chemin

  • Correspondance préfixée prioritaire
  • Ignore les expressions régulières si le préfixe correspond

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

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

4. location ~ pattern

  • Expression régulière sensible à la casse
  • Exemple :
location ~ \.php$ {
    include fastcgi_params;
    ...
}

5. location ~* pattern

  • Expression régulière insensible à la casse
  • Très utile pour des extensions :
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 :

  • Capture le nom du sous-répertoire ($1)
  • Redirige vers le bon fichier PHP dans le bon répertoire
  • Simplifie énormément la configuration

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

  • Préfère les location ^~ pour les fichiers statiques
  • Utilise try_files pour la gestion des erreurs 404
  • Centralise les blocs PHP dans un include commun
  • Regroupe les location ~* pour les extensions statiques (CSS, JS, fonts…)
  • Bloque l’accès aux fichiers sensibles :
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 :

  • Empêcher l’exécution de scripts dans /uploads
  • Interdire les extensions .php dans les répertoires publics
  • Forcer l’authentification sur des routes spécifiques (/admin/, /api/)
  • Ajouter des headers de sécurité sur des zones critiques, Content-Security-Policy en tête :
location /admin/ {
    add_header X-Frame-Options "DENY";
    add_header Content-Security-Policy "default-src 'none';";
}

En résumé

  • Les blocs location permettent de router et sécuriser les requêtes dans Nginx
  • Leur ordre d’évaluation est capital pour éviter les conflits
  • Les expressions régulières permettent de factoriser et gérer dynamiquement les chemins
  • Une bonne structuration évite les erreurs critiques et renforce la sécurité globale de l’application

Ressources complémentaires

Questions fréquentes

Quelle est la priorité entre un bloc location exact (=) et un bloc regex ?
L'ordre de priorité Nginx est : 1) location = (exact), 2) location ^~ (préfixe prioritaire), 3) location ~ ou ~* (regex, premier match gagne), 4) location /prefix (préfixe le plus long). Les blocs = court-circuitent toute évaluation regex.
Un bloc location s'applique-t-il récursivement aux sous-dossiers ?
Non par défaut. Un bloc location /api/ s'applique à /api/ et ses sous-chemins (/api/v1/, /api/users/...) mais chaque sous-chemin peut être surchargé par un bloc location plus spécifique.
Comment déboguer un bloc location qui ne semble pas s'appliquer ?
Active les logs de debug Nginx (error_log /var/log/nginx/debug.log debug;) et utilise nginx -T pour voir la configuration compilée. L'outil nginx-config-validator permet aussi de tester les règles de matching.