nginx Proxy regular expressions

  • Hallo alle zusammen,

    ich habe ein Problem mit der Konfiguration von nginx und hoffe hier hat jemand eine Idee.

    Mein Vorhaben: Ich möchte einen nginx vhost anlegen, der basierend auf der subdomain die Verbindung an einen anderen Port auf einem anderen Server weiterproxiet.

    Also z.B.
    p1234.example.com -> proxy zu http://andererserver:1234

    p1111.example.com -> proxy zu http://andererserver:1111

    p2222.example.com -> proxy zu http://andererserver:2222

    hallo.example.com -> Error 444


    Also alle gültigen Subdomains beginnen mit p, dann eine vierstellige Nummer, das Ziel der Proxyverbindung ist immer der gleiche Server, der Port entspricht der Nummer nach dem "p".

    Ungültige Subdomains (ohne p am Anfang) sollen mit Error 444 quittiert werden.


    Ausgangssituation:

    Diese Konfiguration funktioniert schon "ein Bisschen" ^^
    Ich habe aktuell das Problem, dass die Subdomains mit "p" beginnen. In der Variable $1 wird die Subdomain gespeichert, also wird eine Verbindung der Subdomain p1000.example.com geproxiet an "http://andererserver.domain.tld:p1000" , was natürlich ungültig ist...


    Also wie bekomme ich das p am Anfang der Variable $1 weg?

    Vielleicht kann mir ja ein Meister hier einen Rat geben :)


    Vielen Dank schonmal und viele Grüße

    marpri

  • Ich liebe nginx, aber bei der Syntax fang ich auch immer an zu rotieren und verbringe am Ende genervt Stunden bei Google ?

    Meine Produkte: definitiv zu viele, RS, VPS, Domains, Webhosting, ...

  • geekmonkey Ach, eine Nginx Konfiguration ist wesentlich logischer aufgebaut als beim Apachen :)

    Man könnte das nun auch noch ausbauen, und auf valide Nummern prüfen... z.b.: ^p(\d{1,5})\.example\.com$

    Das würde ich auf jeden Fall empfehlen, wenn man die Usereingaben für Proxy-Verbindungen nutzt.


    marpri Willst Du am anderen Server tatsächlich den originalen HTTP-Hostnamen haben? Kannst Du den dort richtig zuordnen/verarbeiten?

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Ich würde hier auch lieber auf explizite Ports prüfen. Denn ansonsten wird das ggf. zu einem Einfallstor.


    https://regex101.com/r/Jy2wXg/1


    Ausserdem bietet es sich an, mit named capturing groups zu arbeiten, dann sind die matches mit echten Variablennamen verfügbar. In dem Fall $proxyport:


    https://regex101.com/r/BALvGC/1


    Oder man arbeitet direkt mit expliziten matches und nem oder-Parameter:


    https://regex101.com/r/1tCFP7/1

  • Vielen Dank euch 4 für eure Hinweise und Vorschläge! Das hat mir schonmal sehr weitergeholfen.


    marpri Willst Du am anderen Server tatsächlich den originalen HTTP-Hostnamen haben? Kannst Du den dort richtig zuordnen/verarbeiten?

    Das Ziel der Proxyverbindung ist ein anderer Server, auf dem mehrer Instanzen einer Software mit embedded tomcat laufen. Der jeweilige tomcat, der die Verbindung entgegennimmt, arbeitet ohne vHost und dementsprechend ist für den der Hostname-Header nicht relevant. Ich möchte ja nur über den Port definieren, an welche Instanz der meiner Software die Verbindung geht


    Ich würde hier auch lieber auf explizite Ports prüfen. Denn ansonsten wird das ggf. zu einem Einfallstor.

    Die Links zu regex101 haben sehr geholfen. Mein Problem ist, dass ich nicht jedes mal, wenn ich eine neue Instanz meiner Software starte, die nginx Konfiguration um einen expliziten Port erweitern möchte, daher möchte ich ja die Subdomains (und damit die Ports) implizit per Regex auswerten. Aber die Idee, die Subdomain mit capturing groups weiter einzugrenzen, finde ich gut.

    Spricht etwas dagegen, die Firewall des "Zielservers" so zu konfigurieren, dass sie z.B. nur Verbindungen vom "nginx-Proxy-Server" auf Ports 1000 bis 2000 durchlässt? Dann könnte ich auf dem Zielserver Instanzen meiner Software starten, die tomcats an Ports in dieser Range binden und die Inszanzen über die Subdomains p1000 bis p2000 erreichen. Wenn dann auf Port 1234 keine Instanz meiner Software lauscht, gibt der Proxy halt Fehler 502 Bad Gateway zurück.

    Hätte ich dann ein Einfallstor oder wäre das aus eurer Sicht legitim?

    Danke und schönen Abend noch

    marpri