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/

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

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

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.


8

Para mim, funcionou sem o sinal de igual assim:

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

2
Você não precisa do bloco de localização. Apenas use rewrite. Veja a resposta de @ SteveEdison.
PKHunter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.