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/

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;
}

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;
} 

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.


8

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

location /old-url {
  return 301 /new-url;
}

2
W ogóle nie potrzebujesz bloku lokalizacji. Po prostu użyj rewrite. Zobacz odpowiedź @ SteveEdison.
PKHunter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.