it-swarm.com.de

Wie kann ich einen Speicherort in Nginx erstellen, der mit AND ohne einen abschließenden Schrägstrich funktioniert?

Im Moment habe ich diese Konfiguration:

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

Wenn ich jedoch www.mysite.com/phpmyadmin (beachten Sie das Fehlen eines abschließenden Schrägstrichs), es wird nicht gefunden, wonach ich für einen 404 suche. Ich nehme an, weil ich den abschließenden Schrägstrich nicht einbeziehe. Wie kann ich das beheben?

52
Rob

Es könnte sich um den regulären Ausdruck handeln, den Sie verwenden -

location ~ ^/phpmyadmin/(.*)$

Das Obige stimmt mit/phpmyadmin /,/phpmyadmin/irgendetwas/sonst/hier überein, aber es stimmt nicht mit/phpmyadmin überein, da der reguläre Ausdruck den abschließenden Schrägstrich enthält.

Sie möchten wahrscheinlich so etwas:

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

Das Fragezeichen ist ein Quantifizierer für reguläre Ausdrücke und sollte nginx anweisen, mit Null oder einem der vorherigen Zeichen (dem Schrägstrich) übereinzustimmen.

Warnung : Die Community hat diese Lösung als mögliches Sicherheitsrisiko angesehen

38
haymaker

Die bessere Lösung:

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

Stellen Sie sicher, dass der Server zuerst über die Berechtigung /home/phpmyadmin Hat.


Erklärung des Unterschieds mit der akzeptierten Antwort:

Es geht nur um reguläre Ausdrücke .

Zuallererst bedeutet das Zeichen ^, Dass Sie vom Anfang des Strings an übereinstimmen möchten und nicht irgendwo in der Mitte. Das $ Am Ende bedeutet Übereinstimmung mit dem Ende des Strings.

Das (?:) Bedeutet, dass keine Gruppe erfasst wird - wir möchten es nicht in den Erfassungsergebnissen, aber wir möchten einige Zeichen einfach gruppieren. Wir gruppieren es so, weil wir möchten, dass das Zeichen / Ein nicht signifikanter Teil des untergeordneten Pfads und kein wesentlicher Teil des übergeordneten Pfads ist.

39
kbec

Warum würdest du nicht einfach benutzen?

location /phpmyadmin {
    alias /home/phpmyadmin;
}

?

8
womble

Ich weiß, dass dies eine alte Frage ist, aber für jeden, der hier über Google landet, habe ich sie folgendermaßen gelöst (Variation von @ kbecs, die ziemlich gut war):

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

Dadurch wird jede Variation von /foo Erfasst und unter einer anderen URL (einschließlich Parameter) an /bar Weitergeleitet. Ich zeige es mit einer proxy_pass - Direktive, aber es würde auch mit alias funktionieren.

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

Es funktioniert, weil $1 Optional die Unterressourcen plus den führenden Schrägstrich erfasst, sodass Dinge wie /fooextra/ Nicht erfasst werden. Außerdem wird ein vorhandener oder nicht vorhandener Schrägstrich ordnungsgemäß umgeleitet.

7
dlouzan

Diese Umleitung 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 => umgeleitet zu domain.com/new/location
domain.com/location => umgeleitet zu domain.com/new/location
domain.com/location/other => nicht umgeleitet

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

Haben Sie versucht, try_files Direktive?

try_files $uri $uri/ =404;
1
Prasanth

Ich habe es so gemacht

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

Warum nicht einfach zwei Umschreibungen vornehmen:

location ~ ^/phpmyadmin
{
    rewrite /phpmyadmin /home/phpmyadmin/ break;
    rewrite /phpmyadmin/(.*) /home/phpmyadmin/$1 break;
}
0
千木郷