La directive location de Nginx est un outil puissant pour contrôler la manière dont différents types de requêtes sont traités. En définissant des règles dans les blocs location, vous pouvez appliquer des configurations spécifiques, rediriger le trafic vers différentes parties de votre application ou même refuser complètement certaines requêtes. Une utilisation correcte de cette directive permet une gestion efficace des requêtes, essentielle pour améliorer les performances, la sécurité et les fonctionnalités des applications web.
La directive location est définie dans le fichier de configuration nginx.conf :
location [modifier] uri { ... }
modifier : paramètre optionnel définissant le type de correspondance (exacte, préfixe, expression régulière, etc.)
uri : l’URI à faire correspondre
À l’intérieur des accolades, vous pouvez définir diverses directives comme proxy_pass, root ou index.
Une correspondance exacte se produit lorsque la chaîne fournie correspond exactement à l’URI demandée.
location = /exact-match {
root /var/www/html;
index index.html;
}
Seules les requêtes vers /exact-match seront traitées par ce bloc.
Vous pouvez également utiliser une condition if (notez que Nginx ne possède pas de if-else classique) :
location = /exact-match {
root /var/www/html;
index index.html;
if ($http_user_agent ~* "Chrome") {
add_header X-Browser "Chrome";
}
}
Si l’agent utilisateur est Chrome, la réponse inclura l’en-tête supplémentaire X-Browser.
C’est le type le plus courant : il correspond à toute URI commençant par la chaîne spécifiée.
location /prefix {
root /var/www/html;
index index.html;
if ($request_method = POST) {
return 405;
}
}
Ce bloc gère toutes les requêtes commençant par /prefix. Si la méthode est POST, Nginx renvoie 405 Method Not Allowed.
Pour des scénarios plus complexes, vous pouvez utiliser des expressions régulières.
Caractères génériques courants :
. correspond à un caractère
.* correspond à n’importe quelle séquence
^ début de chaîne
$ fin de chaîne
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
if ($request_uri ~* "/admin") {
return 403;
}
if ($request_uri !~* "/admin") {
add_header X-Admin "Not Admin";
}
}
Explications :
~* indique une regex insensible à la casse
\.php$ correspond aux fichiers PHP
si l’URI contient /admin, retour 403
sinon, ajout de l’en-tête X-Admin
location ~* \.jpg$ {
root /var/www/images;
if ($http_referer !~* "^https?://(www\.)?example\.com") {
return 403;
}
}
Correspond à .jpg, .JPG, etc., et sert les images uniquement si le referer provient de example.com.
Nginx applique les règles suivantes :
Correspondance exacte (=)
Expressions régulières (~, ~*) dans l’ordre de définition
Préfixes (/), le plus long étant prioritaire
Exemple :
location = /exact { }
location ~* \.jpg$ { }
location / { }
location /nested {
location /nested/subnested {
root /var/www/html;
}
root /var/www/html;
}
Les requêtes vers /nested/subnested utilisent le bloc interne.
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html;
}
location = /about {
root /var/www/html;
index about.html;
}
location /api {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~ \.php$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
location ~* \.(jpg|jpeg|png|gif|ico)$ {
root /var/www/images;
}
location /admin {
root /var/www/admin;
index index.html;
location /admin/stats {
proxy_pass http://localhost:8080/stats;
}
}
}
sudo systemctl reload nginx
Vérifier la configuration :
sudo nginx -t
Tester les routes :
curl -I http://localhost/about
curl -X POST http://localhost/prefix/form
curl -H "User-Agent: Chrome" http://localhost/exact-match
Consulter les logs :
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
location /admin {
allow 192.168.1.100;
deny all;
}
Seule cette IP aura accès.
|
Directive |
Comportement |
|
root |
ajoute l’URI |
|
alias |
remplace le préfixe |
Exemple :
location /files/ {
alias /data/downloads/;
}
Remarque : toujours terminer alias par /.
Comprendre la directive location est essentiel pour maîtriser le traitement des requêtes dans Nginx. Les différents types de correspondance (exacte, préfixe, regex) et leurs priorités influencent directement les performances et le comportement du site. En combinant ces mécanismes avec des blocs imbriqués, vous obtenez une configuration propre, efficace et sécurisée.