Die Nginx-Location-Direktive ist ein leistungsstarkes Werkzeug zur Steuerung verschiedener Arten von Anfragen. Durch das Definieren von Regeln in Location-Blöcken können Sie gezielte Konfigurationen anwenden, Anfragen an unterschiedliche Bereiche Ihrer Anwendung weiterleiten oder bestimmte Requests vollständig blockieren. Eine effektive Nutzung der Location-Direktive ist entscheidend für Performance, Sicherheit und Funktionalität von Webanwendungen.
Die Location-Direktive wird in der Datei nginx.conf definiert:
location [modifier] uri { ... }
modifier – optionaler Parameter zur Definition des Match-Typs (z. B. exakt, Präfix, Regex)
uri – die zu vergleichende URI
Innerhalb der geschweiften Klammern können verschiedene Einstellungen gesetzt werden (z. B. proxy_pass, root, index).
Ein exaktes Matching greift nur, wenn die URI vollständig übereinstimmt.
location = /exact-match {
root /var/www/html;
index index.html;
}
Nur Anfragen an /exact-match werden hier verarbeitet.
Sie können zusätzlich Bedingungen mit if verwenden (beachten Sie: Nginx besitzt kein klassisches if-else):
location = /exact-match {
root /var/www/html;
index index.html;
if ($http_user_agent ~* "Chrome") {
add_header X-Browser "Chrome";
}
}
Wird Chrome erkannt, wird ein zusätzlicher Header X-Browser gesetzt.
Dies ist der häufigste Typ und greift bei allen URIs, die mit dem angegebenen Pfad beginnen:
location /prefix {
root /var/www/html;
index index.html;
if ($request_method = POST) {
return 405;
}
}
Alle Anfragen wie /prefix/page1 oder /prefix/page2 landen hier. POST-Requests werden mit 405 Method Not Allowed abgelehnt.
Für komplexe Szenarien werden reguläre Ausdrücke verwendet.
Häufige Wildcards:
. – beliebiges einzelnes Zeichen
.* – beliebige Zeichenfolge
^ – Anfang der Zeichenkette
$ – Ende der Zeichenkette
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";
}
}
Erklärung:
~* = Regex ohne Beachtung der Groß-/Kleinschreibung
\.php$ matcht alle PHP-Dateien
/admin → 403 Forbidden
sonst wird X-Admin: Not Admin gesetzt
location ~* \.jpg$ {
root /var/www/images;
if ($http_referer !~* "^https?://(www\.)?example\.com") {
return 403;
}
}
Nur Referer von example.com dürfen Bilder laden.
Exakt (=) – höchste Priorität
Regex (~, ~*) – Reihenfolge zählt
Präfix (/) – längstes Präfix gewinnt
Beispiel:
location = /exact { }
location ~* \.jpg$ { }
location / { }
location /nested {
location /nested/subnested {
root /var/www/html;
}
root /var/www/html;
}
/nested/subnested wird vom inneren Block verarbeitet.
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
Syntax prüfen:
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 beobachten:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
location /admin {
allow 192.168.1.100;
deny all;
}
Nur diese IP erhält Zugriff.
|
Directive |
Verhalten |
Ergebnis |
|
root |
hängt URI an |
/var/www/static/css/style.css |
|
alias |
ersetzt Pfad |
/var/www/assets/css/style.css |
Alias-Beispiel:
location /files/ {
alias /data/downloads/;
}
Wichtig: bei alias immer mit / enden.
Ein tiefes Verständnis der Location-Direktive ist essenziell für sauberes Request-Routing. Exakte Matches, Präfixe und Regex besitzen unterschiedliche Prioritäten und beeinflussen Performance und Verhalten erheblich. Durch verschachtelte Locations lassen sich hochpräzise Regeln definieren. Wer diese Mechanismen beherrscht, baut stabile, sichere und effiziente Nginx-Konfigurationen.