Nginx redireciona um caminho para outro

51

Tenho certeza de que isso já foi solicitado antes, mas não consigo encontrar uma solução que funcione.

Um site mudou os serviços do CMS, mas tem o mesmo domínio. Como faço para configurar uma reescrita do nginx para uma única página?

Por exemplo

Página antiga

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

Nova página

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

Observe que não quero que tudo na página de conteúdo seja redirecionado, mas literalmente apenas o URL mencionado acima. Eu tenho cerca de 9 redirecionamentos para configurar, dos quais não cabem em um padrão.

Obrigado!

Edit: Encontrei esta solução, que parece estar funcionando, exceto pelo fato de que ela redireciona sem uma barra:

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

Mas isso redireciona para:

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

SteveEdson
fonte

Respostas:

87

Citação direta de Armadilhas e erros comuns: Reescrevendo impostos :

Usando a diretiva de retorno, podemos evitar completamente a avaliação da expressão regular.

Use em returnvez de rewritepara redirecionamentos permanentes. Aqui está minha abordagem para este caso de uso ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Pothi Kalimuthu
fonte
11
É definitivamente mais legível. Isso também manterá as consultas que estavam no URL original?
SteveEdson
11
Não. Não vai. Se você realmente quiser manter alguma dúvida sobre redirecionamentos permanentes, veja este pequeno truque ... gist.github.com/pothi/7152399
pothi Kalimuthu
11
Estou certo ao pensar que o uso de ifinstruções no nginx é ruim? Isso ainda seria uma prática melhor do que usar o método de reescrita?
SteveEdson
11
Usar ifjunto com a diretiva de retorno é perfeitamente adequado. Veja wiki.nginx.org/IfIsEvil . Sim, IMO, é melhor do que reescrever.
Pothi Kalimuthu 25/10
13

Idealmente, você não deve usar instruções if se puder evitá-las. Algo assim poderia funcionar (não testado).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 
Gevious
fonte
11
Isso não pegaria tudo no diretório de conteúdo? Eu só quero redirecionar o item individual. Por exemplo, eu tenho um outro item no diretório de conteúdo, mas eu preciso dele redirecionando para ... / outra-new-name / única-page-name2
SteveEdson
11
Eu resolvi isso. Acontece que ele foi redirecionado corretamente, mas o script que estava atingindo estava manipulando o URL depois.
SteveEdson
11
Ah, eu não entendi a pergunta. Eu pensei que você queria que apenas a parte do conteúdo fosse alterada. O princípio permanece o mesmo. Estou feliz que esteja trabalhando para você.
Gevious 25/10/2013
11
Sem problemas, obrigado pela ajuda. Definitivamente vou precisar usá-lo no futuro.
SteveEdson
12

Eu usei a seguinte solução:

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

Funciona um prazer.

SteveEdson
fonte
8

Para mim, funcionou sem o sinal de igual assim:

location /old-url {
  return 301 /new-url;
}
primetimejas
fonte
2
Você não precisa do bloco de localização. Apenas use rewrite. Veja a resposta de @ SteveEdison.
PKHunter