Nginx przekierowuje jedną ścieżkę do drugiej

51

Jestem pewien, że już o to pytano, ale nie mogę znaleźć rozwiązania, które działa.

Witryna przełączyła usługi CMS, ale ma tę samą domenę, jak skonfigurować przepisywanie nginx dla pojedynczej strony?

Na przykład

Stara strona

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

Nowa strona

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

Uwaga : nie chcę przekierowywać wszystkiego na stronie treści, ale dosłownie tylko wspomniany adres URL. Mam do skonfigurowania około 9 przekierowań, z których żadne nie pasuje do wzorca.

Dzięki!

Edycja: Znalazłem to rozwiązanie, które wydaje się działać, z wyjątkiem tego, że przekierowuje bez ukośnika:

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

Ale to przekierowuje do:

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

SteveEdson
źródło

Odpowiedzi:

87

Bezpośredni cytat z pułapek i typowych błędów: Opodatkowanie Przepisów :

Stosując dyrektywę zwrotną, możemy całkowicie uniknąć oceny wyrażeń regularnych.

Użyj returnzamiast rewritestałych przekierowań. Oto moje podejście do tego przypadku użycia ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Pothi Kalimuthu
źródło
1
Jest zdecydowanie bardziej czytelny. Czy to również zachowa zapytania, które były na oryginalnym adresie URL?
SteveEdson
1
Nie. Nie będzie. Jeśli naprawdę chcesz zachować jakiekolwiek zapytania po stałych przekierowaniach, zobacz tę małą sztuczkę ... gist.github.com/pothi/7152399
Pothi Kalimuthu
1
Czy mam rację sądząc, że używanie ifinstrukcji w Nginx jest złe? Czy nadal byłaby to lepsza praktyka niż stosowanie metody przepisywania?
SteveEdson,
1
Korzystanie ifz dyrektywy dotyczącej zwrotu jest całkowicie w porządku. Zobacz wiki.nginx.org/IfIsEvil . Tak, IMO, to lepsze niż używanie przepisywania.
Pothi Kalimuthu
13

Idealnie nie powinieneś używać instrukcji if, jeśli możesz tego uniknąć. Coś takiego może działać (niesprawdzone).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 
Gevious
źródło
1
Czy to nie złapie wszystkiego w katalogu zawartości? Chcę tylko przekierować pojedynczy element. Na przykład mam inny element w katalogu zawartości, ale potrzebuję go przekierować do ... / another-new-name / unique-page-name2
SteveEdson
1
Rozwiązałem to. Okazuje się, że przekierowanie działa poprawnie, ale skrypt, który uderza, zmienia adres URL.
SteveEdson
1
Ach, źle zrozumiałem pytanie. Myślałem, że chcesz zmienić tylko część zawartości. Zasada pozostaje ta sama. Cieszę się, że dla ciebie działa.
Gevious,
1
Nie ma problemu, dziękuję za pomoc, na pewno będę musiał z niej skorzystać w przyszłości.
SteveEdson,
12

Użyłem następującego rozwiązania:

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

Działa uczta.

SteveEdson
źródło
8

Dla mnie działało to bez znaku równości:

location /old-url {
  return 301 /new-url;
}
primetimejas
źródło
2
W ogóle nie potrzebujesz bloku lokalizacji. Po prostu użyj rewrite. Zobacz odpowiedź @ SteveEdison.
PKHunter