Table des matières
Open Table des matières
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 :
- 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;
}
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";
}
location ^~ /static/ { root /var/www/assets; }
4. location ~ pattern
- Expression régulière sensible à la casse
- Exemple :
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 :
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;
}
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
- 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;
}
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