Nginx redirige un chemin vers un autre

51

Je suis sûr que cela a déjà été demandé, mais je ne trouve pas de solution qui fonctionne.

Un site Web a changé de service CMS, mais a le même domaine. Comment puis-je configurer une réécriture nginx pour une seule page?

Par exemple

Vieille page

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

Nouvelle page

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

Veuillez noter que je ne souhaite pas que tout ce qui se trouve dans la page de contenu soit redirigé, mais uniquement l'adresse URL mentionnée ci-dessus. J'ai environ 9 redirections à mettre en place, qui ne rentrent pas dans un modèle.

Merci!

Edit: J'ai trouvé cette solution qui semble fonctionner, à part le fait qu'elle redirige sans slash:

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

Mais cela redirige vers:

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

Steve Edson
la source

Réponses:

87

Citation directe des pièges et des erreurs courantes: taxer les réécritures :

En utilisant la directive return, nous pouvons complètement éviter l’évaluation de l’expression régulière.

Veuillez utiliser returnau lieu de rewritepour les redirections permanentes. Voici mon approche de ce cas d'utilisation ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Pothi Kalimuthu
la source
1
C'est certainement plus lisible. Est-ce que cela va également conserver les requêtes qui étaient sur l'URL d'origine?
Steve Edson
1
Nan. Ça ne va pas. Si vous voulez vraiment conserver les requêtes sur les redirections permanentes, voyez cette petite astuce ... gist.github.com/pothi/7152399
Pothi Kalimuthu
1
Ai-je raison de penser qu'utiliser des ifdéclarations dans nginx est mauvais? Cette pratique serait-elle encore meilleure que l’utilisation de la méthode de réécriture?
Steve Edson
1
L'utilisation ifde la directive de retour est parfaitement acceptable. Voir wiki.nginx.org/IfIsEvil . Oui, IMO, c'est mieux que d'utiliser la réécriture.
Pothi Kalimuthu
13

Idéalement, vous ne devriez pas utiliser if si vous pouvez l'éviter. Quelque chose comme cela pourrait fonctionner (non testé).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 
Gevious
la source
1
Cela ne prendrait-il pas tout dans le répertoire de contenu? Je veux seulement rediriger l'élément individuel. Par exemple, j'ai un autre élément dans le répertoire de contenu, mais il me faut le rediriger vers ... / autre-nouveau-nom / unique-page-nom2
SteveEdson
1
Je l'ai résolu. Il s'avère que la redirection est correcte, mais que le script en cours de frappe a été modifié après l'URL.
Steve Edson
1
Ah, j'ai mal compris la question. Je pensais que vous vouliez seulement que la partie contenu change. Le principe reste le même. Je suis content que cela fonctionne pour vous.
Gevious
1
Pas de problème, merci pour l'aide cependant, j'aurai certainement besoin de l'utiliser à l'avenir.
Steve Edson
12

J'ai utilisé la solution suivante:

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

Fonctionne un régal.

Steve Edson
la source
8

Pour moi cela a fonctionné sans le signe égal comme ceci:

location /old-url {
  return 301 /new-url;
}
primetimejas
la source
2
Vous n'avez pas du tout besoin du bloc d'emplacement. Il suffit d'utiliser rewrite. Voir la réponse de SteveEdison.
PKHunter