Nginx перенаправить один путь на другой

51

Я уверен, что об этом уже спрашивали, но я не могу найти решение, которое работает.

Веб-сайт переключил службы CMS, но имеет тот же домен, как мне настроить перезапись nginx для одной страницы?

Например

Старая страница

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

Новая страница

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

Пожалуйста , обратите внимание , я не хочу, чтобы все содержимое страницы перенаправлялось, а просто URL, упомянутый выше. У меня есть около 9 переадресаций, которые не соответствуют шаблону.

Спасибо!

Изменить: я нашел это решение, которое, кажется, работает, за исключением того факта, что оно перенаправляет без косой черты:

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

Но это перенаправляет на:

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

SteveEdson
источник

Ответы:

87

Прямая цитата из ловушек и распространенных ошибок: переписывание налогов :

Используя директиву return, мы можем полностью избежать вычисления регулярного выражения.

Пожалуйста, используйте returnвместо rewriteпостоянных перенаправлений. Вот мой подход к этому варианту использования ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Поти Калимуту
источник
1
Это определенно более читабельно. Сохранит ли это также какие-либо запросы, которые были на исходном URL?
SteveEdson
1
Нет. Не будет Если вы действительно хотите сохранить какие-либо запросы при постоянных перенаправлениях, посмотрите на этот маленький трюк ... gist.github.com/pothi/7152399
Pothi Kalimuthu
1
Правильно ли я считаю, что использование ifоператоров в nginx - это плохо? Будет ли это все же лучше, чем использование метода перезаписи?
SteveEdson
1
Использование ifвместе с директивой возврата вполне нормально. Смотрите wiki.nginx.org/IfIsEvil . Да, ИМО, это лучше, чем использовать переписать.
Поти Калимуту
13

В идеале вы не должны использовать операторы if, если можете этого избежать. Нечто подобное может работать (не проверено).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 
Gevious
источник
1
Разве это не поймает все в каталоге содержимого? Я только хочу перенаправить отдельный элемент. Например, у меня есть другой элемент в каталоге содержимого, но мне нужно перенаправить его на ... / another-new-name / unique-page-name2
SteveEdson
1
Я решил это. Оказывается, он перенаправил правильно, но скрипт, который ударил, искажал URL после.
SteveEdson
1
Ах, я неправильно понял вопрос. Я думал, что вы хотели изменить только часть контента. Принцип остается прежним. Я рад, что это работает для вас.
Gevious
1
Нет проблем, спасибо за помощь, но я обязательно буду использовать это в будущем.
SteveEdson
12

Я использовал следующее решение:

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

Работает угощение.

SteveEdson
источник
8

Для меня это работало без знака равенства, как это:

location /old-url {
  return 301 /new-url;
}
primetimejas
источник
2
Вам не нужен блок местоположения вообще. Просто используйте rewrite. Смотрите ответ @ SteveEdison.
PKHunter