Wie entferne ich den Location Block aus $ uri in der Nginx-Konfiguration?

15

Ich habe eine Umschreibung in meiner ngix conf-Datei, die ordnungsgemäß funktioniert, außer es scheint, dass der Standortblock als Teil der $ uri-Variablen enthalten ist. Ich möchte nur den Pfad nach dem Ortsblock. Mein aktueller Konfigurationscode ist:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

Unter Verwendung einer Beispiel-URL http://localhost/cargo/testpageder Weiterleitung funktioniert dies, aber der Wert des Parameters "_REWRITE_COMMAND", der von meiner PHP-Datei empfangen wird, ist "/ cargo / testpage". Ich muss den Standortblock entfernen und nur "Testseite" als $ uri haben

Ich bin mir ziemlich sicher, dass es eine Regex-Syntax gibt, um das $ uri zu teilen und es mit $ 1 $ 2 usw. einer neuen Variablen zuzuweisen, aber ich kann kein Beispiel finden, um nur eine Variablenzuweisung mit einem Regex durchzuführen, der nicht Teil eines Umschreibens ist Erklärung. Ich habe stundenlang gesucht und versucht und kann diesen letzten Schritt scheinbar nicht überwinden.

Ich weiß auch, dass ich dies einfach auf dem Anwendungscode entfernen könnte, aber der Grund, warum ich versuchen möchte, es in der nginx conf zu beheben, ist aus Kompatibilitätsgründen, da es auch auf Apache läuft. Ich sollte auch sagen, dass ich einen wirklich hackigen Weg gefunden habe, dies zu tun, aber es beinhaltet eine "if" -Anweisung, um die Existenz von Dateien zu überprüfen, und die Dokumentation sagt ausdrücklich, dass es nicht so sein soll.

Jason
quelle

Antworten:

17

Wenn ich mich umsehe, denke ich, dass es am einfachsten ist, einen regulären Ausdruck mit Captures zu verwenden. Wenn ich dein Beispiel anpasse, bekomme ich:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}
Die Universität
quelle
aha, so einfach, wenn dich jemand darauf hinweist! Ich musste einige kleinere Überarbeitungen vornehmen, um das Umschreiben der Root-URL an den richtigen Ort zu erledigen. Ich habe die Antwort in der Frage angegeben, da ich in diesem Kommentar keine Formatierung vornehmen kann. Die einzige Einschränkung besteht darin, dass der PHP-Block jetzt über diesem Location-Block liegen muss, da / cargo eine reguläre Ausdrücke ist und die Redirect-URL auch / cargo enthält. Sind Sie sich nicht sicher, ob es einen anderen Weg gibt, dies zu verhindern?
Jason
Ich empfehle, die Reihenfolge der regulären und nicht regulären Speicherorte nachzulesen. Normalerweise mache ich irgendwann alle Speicherorte regexp, weil dann die Reihenfolge durch die Reihenfolge in der Konfigurationsdatei bestimmt wird, anstatt durch die Spezifität der Übereinstimmung.
Theuni
cool, danke, ich stellte mir vor, was den oben genannten regulären Ausdruck besser machen würde, wenn er zu / cargo / passt (alles außer index.php), dann würde dies einen Serverfehler aufgrund einer unendlichen Umschreibeschleife verhindern.
Jason
3

Ich habe eine andere Sache gefunden, die für mich funktioniert hat (da ich Gunicorn verwende, kann ich nicht wählen, was ich bestehen soll)

Sie sollten in der Lage sein, mit durchzukommen

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}
g3rv4
quelle
1

Für diejenigen, die möglicherweise Schwierigkeiten haben, es für Micro Service oder API mit Node JS hinzuzufügen, habe ich Folgendes verwendet, um apidie URL auf meinem Server zu entfernen :

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
George Mylonas
quelle