💡 TL;DR
- Les blocs
locationde 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 :
location = /uri(exact)location ^~ /prefixlocation ~ /regexou~*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
- Documentation Nginx officielle : https://nginx.org/en/docs/http/ngx_http_core_module.html#location
- OWASP Secure Headers Project : https://owasp.org/www-project-secure-headers/
- Tutoriel Nginx regex et
location: https://www.digitalocean.com/community/tutorials/understanding-nginx-location-blocks