Nginx fügt abschließenden Schrägstrich ohne Umschreiben hinzu

Nginx fügt abschließenden Schrägstrich ohne Umschreiben hinzu

Ich versuche, eine Weiterleitung zu erstellen, um einen abschließenden Schrägstrich hinzuzufügen.

location / {
  if($request_uri ~ ^([^.]*[^/])$){
    return 301 https://$host$request_uri/;
  }
}

Ich habe keine Ahnung, wie ich das Matching in „if“ durchführen kann. Wenn ich einfach eine Umleitung mit /- erstelle, funktioniert es, nur dieser reguläre Ausdruck scheint defekt zu sein.

AKTUALISIEREN

Umschreiben, ich habe es versucht

location / {
  rewrite ^([^.]*[^/])$ $1/ permanent;
  .....
}

Und

if ($http_x_forwarded_proto != "https") {
  return 301 https://$host$request_uri;
}

funktioniert gut, leitet zu https weiter, ich wollte damit auch Regex erstellen

Antwort1

Das Problem wurde vor langer Zeit gelöst, aber ich sehe, dass viele Leute diese Frage prüfen. Wenn ich mich also recht erinnere, hatte ich diese Codezeile nicht und sie hat mich umgeleitet:

port_in_redirect off;

Ich weiß, ich habe die betreffenden Ports nicht erwähnt, es gibt keine Möglichkeit, darauf zu antworten, aber ich lasse es einfach hier, falls jemand dasselbe Problem hat

Antwort2

Wenn ich die Frage richtig verstehe, möchten Sie automatisch, ohne Verwendung einer 301-Weiterleitung,http://example.com/foo/index.htmlwenn die Anfrage ist fürhttp://example.com/fooohne abschließenden Schrägstrich?

Wenn ja, habe ich festgestellt, dass diese try_files-Konfiguration funktioniert:

try_files $uri $uri/index.html $uri/ =404;
  • Der erste $urientspricht genau der URI
  • Die zweite Option $uri/index.htmlentspricht einem Verzeichnis, das die Datei index.html enthält, wobei das letzte Element des Pfads dem Verzeichnisnamen entspricht, ohne abschließenden Schrägstrich.
  • Der dritte $uri/entspricht dem Verzeichnis
  • Die vierte =404gibt die 404-Fehlerseite zurück, wenn keines der vorhergehenden Muster übereinstimmt.

Antwort3

Dies scheint wie erwartet zu funktionieren:

location / {
    if ($request_uri ~ ^([^.]*[^/])$) {
        return 301 https://$host$request_uri/;
    }
    try_files $uri $uri/ /index.html;
    ....
}

Ich bin mir nicht sicher, ob der Unterschied zu dem, den Sie ausprobiert haben, besteht, außer dem Syntaxfehler, der aufgrund fehlender Leerzeichen in der ifAnweisung aufgetreten sein dürfte (könnte ein Tippfehler sein). … oder vielleicht liegt es daran, dass Sie andere Anweisungen haben, die Sie uns nicht zeigen und die diese hier überschreiben.

verwandte Informationen