Frage Wie kann ich einen Ort in nginx erstellen, der mit UND ohne Schrägstrich arbeitet?


Im Moment habe ich diese Konfiguration:

location ~ ^/phpmyadmin/(.*)$
{
        alias /home/phpmyadmin/$1;
}

Allerdings, wenn ich besuche www.mysite.com/phpmyadmin (Beachten Sie den fehlenden Schrägstrich), es wird nicht das finden, was ich für einen 404 suche. Ich nehme an, weil ich den abschließenden Schrägstrich nicht einschließen. Wie kann ich das beheben?


32
2018-04-03 05:05


Ursprung




Antworten:


Es könnte in dem regulären Ausdruck sein, den Sie verwenden -

location ~ ^/phpmyadmin/(.*)$

Das obige stimmt mit / phpmyadmin /, / phpmyadmin / anything / else / hier überein, aber es passt nicht zu / phpmyadmin, weil der reguläre Ausdruck den abschließenden Schrägstrich enthält.

Du willst wahrscheinlich so etwas:

location ~ /phpmyadmin/?(.*)$ {
    alias /home/phpmyadmin/$1;
}

Das Fragezeichen ist ein regulärer Ausdrucksquantifizierer und sollte nginx auf Null oder eins des vorherigen Zeichens (den Schrägstrich) hinweisen.

HTH


33
2018-04-03 05:45



Vielen Dank! Und danke auch für die Erklärung. Wird in Zukunft nützlich sein. - Rob
Das Muster ist nicht ganz korrekt. Es kann auch Pfad wie "/ phpmyadmin1234" übereinstimmen, offensichtlich ist das nicht was Sie wollen. @ kbecs Lösung ist die richtige. - Meow


Die bessere Lösung:

location ~ ^/phpmyadmin(?:/(.*))?$ {
    alias /home/phpmyadmin/$1;
}

Stellen Sie sicher, dass der Server über Berechtigungen verfügt /home/phpmyadmin zuerst.


Erklärung des Unterschieds mit akzeptierter Antwort:

Es geht nur um Reguläre Ausdrücke.

Zuallererst, die ^ char bedeutet, dass Sie vom Anfang des Strings und nicht irgendwo in der Mitte übereinstimmen möchten. Das $ am Ende bedeutet, dass Sie mit dem Ende der Zeichenfolge übereinstimmen.

Das (?:) bedeutet nicht einfangende Gruppe - wir wollen es nicht in den Erfassungsergebnissen, aber wir wollen einige Zeichen einfach gruppieren. Wir gruppieren es so, weil wir das wollen / char ist ein nicht signifikanter Teil des untergeordneten Pfads und kein wesentlicher Teil des übergeordneten Pfads.


21
2018-02-07 10:13



Warum ist es besser? - Meekohi
@Meow hat dies auf die angenommene Antwort geantwortet - kbec
Dies sollte die akzeptierte Antwort sein - Yonn Trimoreau
@ Meekohi Ich habe eine Erklärung geschrieben - kbec


Warum würdest du es nicht einfach benutzen?

location /phpmyadmin {
    alias /home/phpmyadmin;
}

?


6
2018-04-03 05:18



Weil das nicht für mich funktionierte. Siehe hier: serverfault.com/questions/375602/ ... - Rob
@Rob Hast du es ohne den Schrägstrich auf dem versucht alias Richtlinie? - Shane Madden♦
Dies ist tatsächlich die richtige Antwort und die richtige Art, dies zu tun. Schließen Sie einfach den abschließenden Schrägstrich aus und es funktioniert für URLs, die sowohl mit als auch ohne den abschließenden Schrägstrich eingegeben wurden. Keine Notwendigkeit, irgendetwas auf Nginx zu verkomplizieren, es einfach zu halten, komplizierte Regex und andere lustige Dinge werden Nginx nur verlangsamen. - MitchellK


Diese Weiterleitung wird nur URLs mit und ohne den abschließenden Schrägstrich neu schreiben. Alles, was nach dem Schrägstrich kommt, wird nicht überschrieben.

domain.com/location => auf domain.com/new/location umgeleitet
domain.com/location => auf domain.com/new/location umgeleitet
domain.com/location/other => nicht umgeleitet

server {
  # 301 URL Redirect
  rewrite ^/location/?$ /new/location permanent;
}

2
2017-10-20 22:52





Hast du es versucht? try_files Richtlinie?

try_files $uri $uri/ =404;

1
2017-12-01 10:12





Ich weiß, dass dies eine alte Frage ist, aber für jeden, der über Google hierher kommt, habe ich den folgenden Weg gelöst (eine Variante von @ kbec, die ziemlich gut war):

location ~ ^/foo(/.*)?$ {
  proxy_pass http://$backend$1$is_args$args
}

Dies wird jede Variation von erfassen /foo und leite es um /bar auf einer anderen URL (einschließlich der Parameter). Ich zeige es mit einem proxy_pass Richtlinie, aber es würde auch mit funktionieren alias.

  • /foo -> /bar
  • /foo/ -> /bar/
  • /foo/sub -> /bar/sub
  • /foo/sub1/sub2/?param=value -> /bar/sub1/sub2/?param=value

Es funktioniert, weil $1 wird optional die Unterressourcen plus den führenden Schrägstrich erfassen, so dass es keine Dinge wie aufnehmen wird /fooextra/. Es wird auch einen aktuellen oder nicht vorhandenen End-Schrägstrich richtig umleiten.


1
2017-09-21 08:53





Ich habe es so gemacht

rewrite ^/promo/?$     http://example.com/promo/page43902.html;
location /promo/ {
    root /var/www;
}

0
2017-10-01 07:14