Nginx Location Wildcard - So funktioniert URL-Matching wirklich

Nginx-Konfiguration zeigt eine `location`-Direktive mit optionalem Modifikator und `location_match`. Dies ist ein Beispiel für die Verwendung von Wildcards in Nginx.

Geschrieben von

Rolf Fuhrmann

Veröffentlicht am

28. März 2026

Inhaltsverzeichnis

Bei URL-Matching in Nginx geht es selten um eine echte Platzhalter-Syntax im location-Block, sondern darum, Pfade sauber in Prefix- und Regex-Regeln zu übersetzen. Genau hier entsteht die Verwirrung rund um nginx location wildcard: In der Praxis lösen meist exakte Treffer, längste Präfixe und reguläre Ausdrücke das Problem, nicht ein frei platzierbares Sternchen. In diesem Artikel zeige ich, wie Nginx wirklich entscheidet, welche Regel greift, wann Regex sinnvoll ist und welche Fehler mir in Produktivsystemen am häufigsten begegnen.

Die wichtigste Erkenntnis vorab

  • Im location-Kontext gibt es keine freie Sternchen-Syntax wie bei Hostnamen.
  • Nginx prüft zuerst exakte Treffer und Prefixe, danach Regex, sofern ^~ nicht greift.
  • Für echte Muster sind reguläre Ausdrücke das richtige Werkzeug, nicht ein „Wildcard“ im klassischen Sinn.
  • Wer Hostnamen abfangen will, gehört in server_name und nicht in location.
  • Die besten Regeln sind kurz, eindeutig und so spezifisch wie möglich.

Warum der Wildcard-Begriff bei location in die Irre führt

Die offizielle Nginx-Dokumentation beschreibt location nicht als Platzhalter-Mechanismus, sondern als Auswahl zwischen einem literalem Präfix und einem regulären Ausdruck. Das ist ein wichtiger Unterschied, weil viele aus anderen Systemen ein Sternchen als „beliebige Zeichenfolge“ erwarten und dann nach einer Syntax suchen, die es hier schlicht nicht gibt. In Nginx ist der saubere Gedanke deshalb nicht „Wie baue ich einen Wildcard-Block?“, sondern „Wie drücke ich das URL-Muster präzise aus?“

Der häufigste Denkfehler entsteht durch die Nähe zu server_name. Dort sind Wildcards an den Rändern eines Namens erlaubt, etwa für Subdomains; ein Sternchen darf nur am Anfang oder Ende stehen und nicht mitten im Namen. Im location-Block gilt das nicht, denn hier entscheidet Nginx über URI-Pfade, nicht über Hostnamen. Wer also eigentlich *.example.org abbilden will, ist im falschen Kontext unterwegs.

Für die Praxis heißt das: Ich arbeite in location-Blöcken mit klaren Prefixen oder mit Regex, wenn ein Muster wirklich variabel ist. Genau diese Trennung macht die Konfiguration später wartbar, und sie reduziert Überraschungen im Betrieb. Als Nächstes lohnt sich ein Blick auf die eigentliche Reihenfolge, in der Nginx eine passende Regel sucht.

So entscheidet Nginx, welche location greift

Nginx wertet die Anfrage nicht einfach von oben nach unten aus. Zuerst wird die URI normalisiert, also dekodiert und von Punkten, Doppel-Slashes und ähnlichen Sonderfällen bereinigt. Danach prüft Nginx exakte Treffer und Prefixe, und erst im nächsten Schritt folgen reguläre Ausdrücke in der Reihenfolge ihres Auftretens.

  1. Exakter Treffer mit location = /pfad beendet die Suche sofort.
  2. Prefix mit dem längsten passenden Pfad gewinnt zunächst intern.
  3. ^~ stoppt die weitere Regex-Prüfung für diesen Prefix.
  4. Regex mit ~ oder ~* wird in Konfigurationsreihenfolge getestet.
  5. Wenn kein Regex passt, bleibt der zuvor gefundene Prefix aktiv.

Ein Detail wird dabei oft übersehen: Nginx bewertet nur den URI-Teil der Anfrage, nicht den Query-String. /produkt?id=12 und /produkt?id=99 landen also im gleichen Matching, weil die Parameter für location keine Rolle spielen. Genau deshalb sind Pfadregeln und Applikationslogik zwei verschiedene Ebenen.

In vielen Konfigurationen ist diese Reihenfolge der entscheidende Hebel, nicht ein „Wildcard“-Trick. Sobald man sie verstanden hat, wird auch klar, wann Prefixe reichen und wann Regex den besseren Job macht.

Prefix, regex oder named location

Ich entscheide in Projekten fast immer nach demselben Muster: möglichst wenig Magie, möglichst viel Klarheit. Die folgende Gegenüberstellung zeigt, welches Werkzeug in welchem Fall sinnvoll ist.

Variante Beispiel Wann ich sie nutze Grenze oder Risiko
Exakter Treffer location = /healthz Für Checks, Redirects oder Sonderfälle mit genau einem Pfad Unflexibel, deckt nur einen URI ab
Prefix location /assets/ Für Verzeichnisse, API-Bäume und alles mit stabiler Struktur Kann von späteren Regex-Regeln überlagert werden
Prefix mit ^~ location ^~ /assets/ Wenn ein Bereich sicher vor Regex geschützt sein soll Hilft nur gegen Regex, nicht gegen falsch gewählte Prefixe
Regex case-sensitive location ~ ^/api/v[0-9]+/ Für Versionen, variable IDs oder sehr gezielte Muster Langsamer und anfälliger für zu breite Muster
Regex case-insensitive location ~* \.(css|js|png)$ Wenn Endungen oder Legacy-Pfade tolerant gematcht werden sollen Kann auf Linux semantisch großzügiger sein als das Dateisystem
Named location location @fallback Für interne Weiterleitungen und Fehlerpfade Kein normaler Request-Entry-Point

Wenn ich schnell entscheiden muss, nehme ich fast immer den einfachsten Mechanismus, der das Problem sauber löst. Prefixe sind für die meisten Webserver-Konfigurationen die beste Default-Wahl, Regex setze ich nur dort ein, wo ich wirklich Variabilität brauche. Das spart nicht nur Rechenzeit, sondern vor allem spätere Fehlersuche.

Die eigentliche Kunst besteht also nicht darin, möglichst viele Regeln zu bauen, sondern die richtige Kategorie zu wählen. Genau das zeigt sich besonders gut an konkreten URL-Mustern.

Clients verbinden sich über NGINX mit Webservern. NGINX's location wildcard-Funktion leitet Anfragen flexibel weiter.

Praktische Beispiele für typische URL-Muster

In realen Setups tauchen immer wieder dieselben Muster auf: statische Assets, API-Präfixe, Dateiendungen und Sonderrouten für Monitoring oder Fehlerbehandlung. Die folgenden Beispiele zeigen, wie ich solche Fälle in Nginx typischerweise abbilden würde.

Statische Assets sauber schützen

location ^~ /assets/ {
    expires 30d;
    add_header Cache-Control "public";
}

Diese Form ist für CSS, JS, Bilder oder Fonts sehr praktisch. Das ^~ verhindert, dass später definierte Regex-Regeln aus Versehen an den Asset-Pfad heranrücken, was gerade in größeren Konfigurationen ein echter Stabilitätsgewinn ist.

API-Versionen oder strukturierte Pfade

location ~ ^/api/v[0-9]+/ {
    proxy_pass http://backend;
}

Hier braucht man Variable im Pfad, aber kein freies Muster über den gesamten URI. Der Regex bleibt eng genug, um nicht zu viel zu fassen, und zugleich flexibel genug für Versionen wie /api/v1/ oder /api/v2/. Genau solche Regeln sind mit einem einfachen Prefix nicht mehr sauber lösbar.

Dateiendungen gezielt behandeln

location ~* \.(css|js|png|jpg|jpeg|svg|webp)$ {
    access_log off;
    expires 7d;
}

Hier ist ~* oft sinnvoll, wenn die Endung tolerant gematcht werden darf. Ich setze das aber bewusst sparsam ein, weil Groß- und Kleinschreibung im Dateisystem und in der URL-Logik nicht immer gleich behandelt werden sollten. Für saubere Produktivsysteme ist „möglichst eindeutig“ meist besser als „möglichst tolerant“.

Lesen Sie auch: Nginx Plugin nicht installiert? So löst du den Certbot-Fehler!

Sonderrouten für Health Checks oder Fallbacks

location = /healthz {
    return 200 "ok";
}

location / {
    try_files $uri $uri/ @fallback;
}

location @fallback {
    proxy_pass http://backend;
}

Diese Kombination ist robust, weil sie Sonderfälle klar vom normalen Request-Flow trennt. Ein exakter Health-Check ist für Load Balancer und Uptime-Monitoring ideal, und die Named Location hält den Fallback intern, statt den Client unnötig umzuleiten.

Diese Beispiele wirken banal, sind in der Praxis aber genau deshalb wertvoll: Sie zeigen, dass gute Nginx-Konfiguration nicht von Zauberregeln lebt, sondern von klaren, eng gefassten Mustern. Im nächsten Schritt geht es um die Stellen, an denen diese Klarheit typischerweise verloren geht.

Die häufigsten Fehler bei wildcard-artigen Regeln

Die meisten Probleme entstehen nicht durch Nginx selbst, sondern durch falsche Erwartungen an das Matching. Ich sehe dabei immer wieder dieselben Muster.

  • Ein Sternchen im location erwartet: Das funktioniert nicht wie bei Hostnamen und führt meist direkt zu Frust.
  • Zu breite Regex: Ein unpräziser Ausdruck trifft mehr URIs als geplant und ist später schwer zu debuggen.
  • Falsche Reihenfolge angenommen: Wer die Matching-Logik von oben nach unten liest, übersieht die echte Priorität.
  • ^~ falsch eingesetzt: Das schützt nur vor Regex, nicht vor einem falsch formulierten Prefix.
  • Query-Parameter mit URI verwechselt: Die Parameter gehören nicht in die Location-Entscheidung.
  • server_name und location vermengt: Hostname-Matching und Pfad-Matching sind zwei verschiedene Ebenen.

Ein besonders teurer Fehler ist für mich die Annahme, dass man mit Regex immer „mehr kann“. Das stimmt formal, aber nicht operativ. Jede zusätzliche Flexibilität kostet Lesbarkeit, und sobald mehrere Kollegen an der Konfiguration arbeiten, wird aus einem kleinen Regex schnell eine fragile Sonderlösung.

Bei Unklarheiten teste ich deshalb zuerst mit einem minimalen Konfigurationsausschnitt und prüfe dann, welcher Block wirklich greift. So lässt sich schnell erkennen, ob das Problem im Matching, in der Reihenfolge oder einfach im falschen Regeltyp liegt. Genau daraus ergibt sich auch meine Regel für wartbare Konfigurationen.

So halte ich Nginx-Regeln wartbar und schnell

Wenn ich eine Konfiguration langfristig sauber halten will, versuche ich drei Dinge konsequent: so wenig Regex wie möglich, so viel Spezifität wie nötig und so wenig Überraschung wie technisch vertretbar. Das klingt unspektakulär, ist aber im Betrieb meist der entscheidende Unterschied zwischen „läuft“ und „läuft nachvollziehbar“.

  • Ich beginne mit dem engsten Prefix und greife nur dann zu Regex, wenn der Pfad wirklich variabel ist.
  • Ich sichere kritische Bereiche mit ^~, wenn dort keine Regex-Regel dazwischenfunken darf.
  • Ich halte Regex kurz und lesbar, statt mehrere Sonderfälle in einen einzigen Ausdruck zu pressen.
  • Ich trenne Hostnamenlogik von URI-Logik, damit die Zuständigkeit klar bleibt.
  • Ich prüfe Änderungen mit nginx -t, bevor sie in Produktion gehen.

Ein weiterer praktischer Punkt ist Konsistenz. Wenn eine Anwendung unter /app/ läuft, sollte nicht parallel noch /app, /application oder ein halb passender Regex existieren, nur weil es „auch irgendwie funktioniert“. Solche Parallelwelten sind der Anfang von schwer reproduzierbaren Fehlern.

Wer Nginx in größeren Umgebungen betreibt, profitiert außerdem von klaren Namensmustern und kurzen Kommentaren direkt an den Sonderfällen. Nicht jede Regel braucht Erklärung, aber jede Ausnahme sollte sofort erkennbar machen, warum sie existiert. Genau das macht spätere Anpassungen deutlich günstiger.

Das einfache Muster, das in den meisten Setups trägt

Für die Praxis bleibt für mich eine einfache Reihenfolge am verlässlichsten: erst den URI sauber mit einem Prefix oder einem exakten Treffer abfangen, dann nur dort mit Regex arbeiten, wo das Muster wirklich variabel ist, und Hostname-Wildcards nie mit Pfadregeln verwechseln. So löst man das eigentliche Problem hinter nginx location wildcard, ohne sich an einer Syntax festzuhalten, die Nginx in diesem Kontext gar nicht anbietet.

Wenn ich eine bestehende Konfiguration prüfe, suche ich daher zuerst nach unnötig breiten Regex, danach nach fehlenden ^~-Schutzschichten und erst am Ende nach echten Spezialfällen. In den meisten Webserver-Setups reicht diese Reihenfolge schon aus, um Matching verständlicher, schneller und deutlich robuster zu machen.

Häufig gestellte Fragen

Prefix-Locations (z.B. `/assets/`) matchen den Beginn eines URI und sind oft schneller und einfacher. Regex-Locations (z.B. `~ ^/api/v[0-9]+/`) nutzen reguläre Ausdrücke für komplexere Muster und variable Pfade, sind aber rechenintensiver und potenziell fehleranfälliger.

Nein, im klassischen Sinne gibt es keine freie Sternchen-Wildcard-Syntax wie bei Hostnamen. Nginx nutzt exakte Treffer, Prefixe und reguläre Ausdrücke. Der Begriff "Wildcard" führt oft zu Verwirrung, da er in anderen Kontexten anders verwendet wird.

Nginx prüft zuerst exakte Treffer, dann den längsten passenden Prefix. Wenn `^~` verwendet wird, stoppt die Suche hier. Danach werden reguläre Ausdrücke in ihrer Reihenfolge geprüft. Passt kein Regex, bleibt der zuvor gefundene Prefix aktiv.

Verwenden Sie `^~` vor einem Prefix, wenn Sie sicherstellen möchten, dass dieser Bereich nicht von nachfolgenden regulären Ausdrücken überschrieben wird. Dies ist nützlich für statische Assets oder geschützte Pfade, um die Konfiguration robuster zu machen.

Nginx Location-Regeln basieren ausschließlich auf dem URI-Pfad vor dem Fragezeichen. Query-Parameter (z.B. `?id=123`) werden für das Matching ignoriert. Wenn Sie Parameter verarbeiten müssen, geschieht dies typischerweise in der Anwendung oder mit `if`-Anweisungen innerhalb der Location.

Artikel bewerten

Bewertung: 0.00 Stimmenanzahl: 0

Tags:

nginx location wildcard nginx location regex beispiel nginx location reihenfolge nginx location erklärung nginx url matching nginx server_name wildcard

Beitrag teilen

Rolf Fuhrmann

Rolf Fuhrmann

Mein Name ist Rolf Fuhrmann und ich habe über 12 Jahre Erfahrung im Bereich IT-Infrastruktur, Web-Technologien und Sicherheit. Schon früh entwickelte ich eine Begeisterung für die digitale Welt und die Herausforderungen, die sie mit sich bringt. Besonders fasziniert mich die Schnittstelle zwischen Technologie und Sicherheit, da ich oft beobachte, wie wichtig ein durchdachter Umgang mit Daten und Systemen ist. In meinen Beiträgen möchte ich komplexe Themen verständlich aufbereiten und aktuelle Trends beleuchten. Dabei lege ich großen Wert auf sorgfältige Recherche und den Vergleich verschiedener Informationsquellen, um meinen Lesern präzise und nützliche Inhalte zu bieten. Ich freue mich darauf, mein Wissen und meine Perspektiven mit Ihnen zu teilen und gemeinsam die spannende Welt der IT und Sicherheit zu erkunden.

Kommentar schreiben