Nginx-Regex zum Abrufen der URI ohne Standort

Nginx-Regex zum Abrufen der URI ohne Standort

Ich habe Nginx als Reverse-Proxy für einige Anwendungen laufen. Eine Location-Direktive läuft korrekt und sendet Anfragen an eine Unix-Socket-Datei und weiter an die vorgelagerte WSGI-App. Die Direktive, mit der ich ein Problem habe, istlocation ~ ^/sub/alarm(.*)$. Ich habe ein paar Umschreibungen, die zu funktionieren scheinen, aber für den Fall, dass sie mit meinen anderen Absichten kollidieren, erkläre ich meine Absicht bei jeder Anweisung:

  • Die erste Serveranweisung sollte alle http-Angaben auf https umleiten. Das scheint gut zu funktionieren.
  • Die zweite Server-Direktive hat eine Standortdirektive, die den Verkehr zu meiner WSGI-Anwendung leitet. Das funktioniert gut. Die andere StandortdirektiveIch wollte damit statische Inhalte bereitstellen, sobald /home/myuser/alarm.example.com/ein GET empfangen wird fürexample.net/sub/alarm. (z. B. sollte example.net/sub/alarm/pretty.css /home/myuser/alarm.example.com/pretty.css übergeben) Stattdessen wird die WSGI-App geladen.
  • Die letzte Serveranweisung sollte alarm.example.net auf example.net/sub/alarm umleiten, da ich kein Wildcard-Zertifikat habe, aber eine einfache Abkürzung und Verschlüsselung wollte. Das scheint gut zu funktionieren.

conf:

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name example.com www.example.com;
    rewrite ^/(.*) https://example.com/$1 permanent;
}

server {
        listen 443 ssl;
        listen [::]:443 ipv6only=on ssl;
        charset utf-8;
        client_max_body_size 75M;
        server_name example.com www.example.com;
        ssl_certificate /etc/ssl/certs/example.com.crt;
        ssl_certificate_key /etc/ssl/private/example.com.key;

        location / {
                include uwsgi_params;
                uwsgi_pass unix:///tmp/example.com.sock;
        }

        location ~ ^/sub/alarm(.*)$ {
                alias /home/appusername/alarm.example.com;
                index index.html;
                try_files $1 $1/;
        }
}

server {
        listen 80;
        server_name alarm.example.com;
        rewrite ^ $scheme://example.com/sub/alarm$request_uri permanent;
}

Ich schaute aufwie entferne ich den Standortblock von $uri in der Nginx-Konfiguration?um zu versuchen, den Teil meiner Standortdatei nach der URI abzurufen. Ich glaube, ich übersehe etwas bezüglich der Prioritäten.

Ein weiterer Versuchwar ohne regulären Ausdruck:

location /sub/alarm/ {
        alias /home/appusername/alarm.example.com;
        index index.html;
        try_files $uri $uri/index.html =404;
}

Im obigen Fall konnte ich index.html laden, als ich zu alarm.example.com ging (was korrekt zuhttps://example.com/sub/alarm/), aber alle Ressourcen haben eine 404-Fehlermeldung ausgegeben.

Schließlich habe ich versucht, beide Versuche zu kombinieren, aber anscheinend kann ich die Tilde nicht in den Standortblock einfügen („unbekannte Anweisung“ beim Neuladen von Nginx):

location /sub/alarm/ {
        ~ ^/sub/alarm(.)$
        try_files /home/appusername/alarm.example.com$1 /home/appusername/alarm.example.com$1/;
}

Zusätzliche Bemerkungen

  • Die dynamische App auf example.com hat überhaupt nichts mit der statischen „Alarm“-App zu tun. Sie ist nur enthalten, weil sie anstelle der Alarm-App bereitgestellt wird, wenn ich den regulären Ausdruck ausprobiere.
  • Ich habe es immer vermieden, etwas über Regex zu lernen (wahrscheinlich unklug, aber ich habe es in den letzten 7 Jahren bis heute nie wirklich gebraucht) und zahle jetzt den Preis dafür, da ich Nginx konfiguriere. Ich habeRegex 101um meine Regex-Zeichenfolge zu erhalten ^\/sub\/alarm(.*)$. Es schien anzuzeigen, dass ich Escape-Schrägstriche verwenden musste, aber Nginx scheint das in den Beispielen nicht anzuzeigen. Bitte lassen Sie mich wissen, ob es ein anderes Konzept gibt, das ich studieren muss. Ich beende meine Regex-Vermeidungshaltung ab heute offiziell.
  • Wenn die Syntax für das Neuladen von Nginx gültig genug war, trat mein Fehler 2015/10/12 20:25:57 [notice] 30500#0: signal process startedbei allen Versuchen auf.

Antwort1

Der Benutzer (ähm ... ich) hat also etwas übersehen, was ein offensichtlicher Hinweis hätte sein sollen:

Im obigen Fall konnte ich index.html laden, als ich zu alarm.example.com ging (was korrekt zu https://example.com/sub/alarm/), aber alle Ressourcen haben eine 404-Fehlermeldung ausgegeben.

Auch wenn dieses Beispiel immer noch nicht richtig war,hätte die Dateiberechtigungen für die Ressourcendateien überprüfen sollen. Nginx läuft als www-data und in der Gruppe für die Datei index.html, muss aber in der Gruppe für alle Dateien sein. Der Dateibesitzer ist der Benutzer appusername.

Ich habe seitdem eine weitere App (genannt „Beer“) hinzugefügt, die wie ein Alarm weitergeleitet wird. Ich habe jetzt die Grundlagen von Regex gelernt und konnte dies in einem Standortblock tun:

server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name example.com www.example.com;
    rewrite ^/(.*) https://example.com/$1 permanent;
}

server {
        listen 443 ssl;
        listen [::]:443 ipv6only=on ssl;
        charset utf-8;
        client_max_body_size 75M;
        server_name example.com www.example.com;
        ssl_certificate /etc/ssl/certs/example.com.crt;
        ssl_certificate_key /etc/ssl/private/example.com.key;
        error_log /var/log/nginx/error.log warn;

        location ~ ^/sub/(alarm|beer)(.*)$ {
                alias /home/appusername/$1.example.com/;
                #index  index.html index.htm;
                try_files $2 $2/ =404;
        }

        location / {
                include uwsgi_params;
                uwsgi_pass unix:///tmp/example.com.sock;
        }
}

server {
        listen 80;
        server_name alarm.example.com;
        rewrite ^ $scheme://example.com/sub/alarm$request_uri permanent;
}

Kümmern Sie sich nicht um den Wechsel der Reihenfolge der Standortblöcke. Das ist nur ein Zufallsprodukt von Eintippen und erneutem Eintippen.

verwandte Informationen