De Nginx location-directive is een krachtig hulpmiddel voor het beheren van verschillende soorten requests. Door regels te definiëren in location-blokken kun je specifieke configuraties toepassen, verkeer naar verschillende delen van je applicatie routeren of bepaalde requests volledig weigeren. Correct gebruik van de Nginx location-directive is essentieel voor betere prestaties, beveiliging en functionaliteit van webapplicaties.
De location-directive wordt gedefinieerd in het configuratiebestand nginx.conf:
location [modifier] uri { ... }
modifier – optionele parameter die het type match bepaalt (bijv. exact, prefix, regex)
uri – de URI die moet worden gematcht
Binnen de accolades kun je verschillende instellingen definiëren, zoals proxy_pass, root en index.
Een exacte match treedt alleen op wanneer de opgegeven string exact overeenkomt met de aangevraagde URI.
location = /exact-match {
root /var/www/html;
index index.html;
}
Alleen requests naar /exact-match worden door dit location-blok verwerkt.
Je kunt ook voorwaarden toevoegen met if (houd er rekening mee dat Nginx geen klassieke if-else kent):
location = /exact-match {
root /var/www/html;
index index.html;
if ($http_user_agent ~* "Chrome") {
add_header X-Browser "Chrome";
}
}
Als de user agent Chrome is, wordt een extra header X-Browser toegevoegd.
Dit is het meest voorkomende type en matcht elke URI die begint met de opgegeven string:
location /prefix {
root /var/www/html;
index index.html;
if ($request_method = POST) {
return 405;
}
}
Requests zoals /prefix/page1 of /prefix/page2 worden hier verwerkt. Bij POST-requests retourneert Nginx 405 Method Not Allowed.
Voor complexere matches kun je regex gebruiken.
Veelgebruikte wildcards:
. – elk enkel teken
.* – willekeurige tekenreeks
^ – begin van de string
$ – einde van de string
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";
}
}
Uitleg:
~* betekent hoofdletterongevoelige regex
\.php$ matcht alle PHP-bestanden
bevat de URI /admin → 403 Forbidden
anders wordt X-Admin: Not Admin toegevoegd
location ~* \.jpg$ {
root /var/www/images;
if ($http_referer !~* "^https?://(www\.)?example\.com") {
return 403;
}
}
Alle JPG-varianten worden gematcht, maar alleen geserveerd als de referer van example.com komt.
Nginx volgt deze volgorde:
Exact (=) – hoogste prioriteit
Regex (~, ~*) – in volgorde van definitie
Prefix (/) – langste prefix wint
Voorbeeld:
location = /exact { }
location ~* \.jpg$ { }
location / { }
location /nested {
location /nested/subnested {
root /var/www/html;
}
root /var/www/html;
}
/nested/subnested wordt verwerkt door het binnenste blok.
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
Configuratie controleren:
sudo nginx -t
Requests testen:
curl -I http://localhost/about
curl -X POST http://localhost/prefix/form
curl -H "User-Agent: Chrome" http://localhost/exact-match
Logs bekijken:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
location /admin {
allow 192.168.1.100;
deny all;
}
Alleen deze IP krijgt toegang.
|
Directive |
Gedrag |
Resultaat |
|
root |
voegt URI toe |
/var/www/static/css/style.css |
|
alias |
vervangt prefix |
/var/www/assets/css/style.css |
Alias-voorbeeld:
location /files/ {
alias /data/downloads/;
}
Let op: gebruik altijd een afsluitende / bij alias.
Een goed begrip van de location-directive is essentieel voor correcte request-afhandeling. Exacte matches, prefixes en regex hebben elk hun eigen prioriteit en beïnvloeden prestaties en gedrag. Door location-blokken te nesten krijg je zeer fijne controle over URL-routing. Wie deze patronen beheerst, bouwt schone, efficiënte en veilige Nginx-configuraties.