fragen stichworte

Nginx URI umschreiben, um ein Präfix zu entfernen?

Ich habe eine schlanke Anwendung, die ich unter einem Verzeichnispfad in einer Domäne platzieren möchte. Momentan habe ich es gut mit der Standard-Slim-Datei, aber ich möchte eine Regel zum Umschreiben setzen.

Die Regel zum Umschreiben, die ich möchte, ist, dass nur jede mit/foobar/vorangestellte URL akzeptiert wird, wobei/foobar/entfernt wird, bevor sie auf slim trifft. Hier ist die entsprechende Umschreibungsregel in meiner Apache-Konfiguration, die ich zuvor verwendet habe, und arbeitete genau so, wie ich es wollte:

RewriteEngine On
RewriteRule ^/foobar(/.*)/foobar/public/index.php$1 [QSA,L]

Wir arbeiten mit dieser Umschreibungsfunktion so, dass der Parameter $ _SERVER ['REQUEST_URI'] der vollständige "http://localhost/foobar/test" bleibt, jedoch der Pfad (auf dem Slim stimmt mit der Route überein) ist nur "/test", sodass wir nicht explizit eine Routengruppe erstellen müssen.

Meine Nginx-Konfiguration sieht im Moment so aus:

server {
    listen 80;
    server_name  www.mysite.com mysite.com;
    root/var/www/mysite/foobar/public;

    # This is what I have tried adding, to no avail
    rewrite ^/foobar(/.*)/index.php$1 break;

    try_files $uri/index.php;

    location/index.php {
        fastcgi_connect_timeout 3s;
        fastcgi_read_timeout 10s;
        fastcgi_pass app:9000;     # "app" is a docker container

        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Ich habe schon seit Stunden verschiedene Regeln ausprobiert. Ich bin nicht wirklich sicher, was ich tue, offensichtlich missverstehe ich, wie Nginx funktioniert, und ich bin sicher, dass ein Experte in Nginx die richtige Antwort bereits kennt. Wenn es jemanden gibt, der Auskunft darüber gibt, wo ich falsch liege, würde ich das sehr schätzen!

Vielen Dank im Voraus!

Aktualisierter Versuch:

server {
    listen 80;
    server_name  www.mysite.com mysite.com;
    root/var/www/mysite;
    index index.php;

    location ~ ^/foobar(/.*)$ {
        root/var/www/mysite/foobar/public;

        fastcgi_connect_timeout 3s;
        fastcgi_read_timeout 10s;
        fastcgi_pass app:9000;

        include fastcgi_params;
        fastcgi_param PATH_INFO $1;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    }
}

antworten

Sie haben Recht, Nginx hat eine andere Logik bei Weiterleitungen.

Dieser Ansatz kann für Sie funktionieren. Ich habe jedoch nginx nicht mit einer Software verwendet, die Muster wie diese verwendet, daher bin ich nicht sicher, ob dies funktioniert. Dies ist möglicherweise auch nicht die optimale Möglichkeit, dies durchzuführen.

location ~ ^/foobar(/.*)$ {
    fastcgi_connect_timeout 3s;
    fastcgi_read_timeout 10s;
    fastcgi_pass app:9000;     # "app" is a docker container

    include fastcgi_params;
    fastcgi_param PATH_INFO $1;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}