Nginx leitet einen Pfad zu einem anderen um

51

Ich bin sicher, dass dies schon einmal gefragt wurde, aber ich kann keine Lösung finden, die funktioniert.

Eine Website hat den CMS-Dienst gewechselt, hat jedoch dieselbe Domain. Wie richte ich eine Nginx-Umschreibung für eine einzelne Seite ein?

Z.B

Alte Seite

http://sitedomain.co.uk/content/unique-page-name

Neue Seite

http://sitedomain.co.uk/new-name/unique-page-name

Bitte beachten Sie , dass nicht alle Inhalte der Inhaltsseite umgeleitet werden sollen, sondern nur die oben genannte URL. Ich muss ungefähr 9 Weiterleitungen einrichten, von denen keine in ein Muster passen.

Vielen Dank!

Edit: Ich habe diese Lösung gefunden, die anscheinend funktioniert, abgesehen von der Tatsache, dass sie ohne Schrägstrich umleitet:

if ( $request_filename ~ content/unique-page-name/ ) {
   rewrite ^ http://sitedomain.co.uk/new-name/unique-page-name/? permanent;
}

Dies leitet jedoch weiter zu:

http://sitedomain.co.uknew-name/unique-page-name/

SteveEdson
quelle

Antworten:

87

Direktes Zitat aus Fallstricken und häufigen Fehlern: Besteuern von Umschreibungen :

Durch die Verwendung der return-Direktive können wir die Auswertung von regulären Ausdrücken vollständig vermeiden.

Bitte verwenden Sie returnanstelle von rewritefür dauerhafte Weiterleitungen. Hier ist mein Ansatz für diesen Anwendungsfall ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Pothi Kalimuthu
quelle
1
Es ist definitiv lesbarer. Behalten Sie dabei auch alle Abfragen bei, die sich auf der ursprünglichen URL befanden?
SteveEdson
1
Nee. Das wird es nicht. Wenn Sie wirklich Fragen zu permanenten Weiterleitungen behalten möchten, sehen Sie sich diesen kleinen Trick an ... gist.github.com/pothi/7152399
Pothi Kalimuthu
1
Habe ich Recht, wenn ich denke, dass die Verwendung von ifAnweisungen in Nginx schlecht ist? Wäre dies immer noch eine bessere Übung als das Umschreiben?
SteveEdson
1
Die Verwendung ifzusammen mit der Rückgaberichtlinie ist vollkommen in Ordnung. Siehe wiki.nginx.org/IfIsEvil . Ja, IMO, es ist besser als das Umschreiben.
Pothi Kalimuthu
13

Idealerweise sollten Sie if-Anweisungen nicht verwenden, wenn Sie dies vermeiden können. So etwas könnte funktionieren (ungetestet).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 
Gevious
quelle
1
Würde das nicht alles im Inhaltsverzeichnis fangen? Ich möchte nur den einzelnen Artikel umleiten. Zum Beispiel habe ich ein anderes Element im Inhaltsverzeichnis, aber ich muss es umleiten zu ... / another-new-name / unique-page-name2
SteveEdson
1
Ich habe es gelöst. Es stellte sich heraus, dass die Weiterleitung korrekt war, aber das Skript hat die URL danach entstellt.
SteveEdson
1
Ah, ich habe die Frage falsch verstanden. Ich dachte, Sie wollten nur den Inhaltsteil ändern. Das Prinzip bleibt dasselbe. Ich bin froh, dass es für Sie arbeitet.
Gevious
1
Kein Problem, danke für die Hilfe, ich werde das auf jeden Fall in Zukunft brauchen.
SteveEdson
12

Ich habe die folgende Lösung verwendet:

rewrite ^(/content/unique-page-name)(.*)$   http://sitedomain.co.uk/new-name/unique-page-name/$2 permanent;

Funktioniert ein Vergnügen.

SteveEdson
quelle
8

Bei mir hat es ohne das Gleichheitszeichen so geklappt:

location /old-url {
  return 301 /new-url;
}
primetimejas
quelle
2
Sie brauchen den Standortblock überhaupt nicht. Verwenden Sie einfach rewrite. Siehe @ SteveEdisons Antwort.
PKHunter