Nginx переспрямовує один шлях на інший


51

Я впевнений, що про це вже просили, але я не можу знайти рішення, яке працює.

Веб-сайт перемикає послуги CMS, але має той самий домен, як я можу налаштувати перезапис nginx для однієї сторінки?

Напр

Стара сторінка

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

Нова сторінка

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

Зауважте , я не хочу, щоб все на змістовій сторінці було переспрямовано, а буквально лише URL-адреса, згадана вище. У мене є дев'ять переспрямувань, які потрібно налаштувати, не з яких вписується в шаблон.

Дякую!

Редагувати: я знайшов це рішення, яке, здається, працює, за винятком того, що воно перенаправляє без косої риси:

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/

Відповіді:


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 . Так, IMO, це краще, ніж використовувати переписувати.
Pothi Kalimuthu

13

В ідеалі ви не повинні використовувати, якщо заяви, якщо ви можете уникнути цього. Щось подібне може спрацювати (неперевірено).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 

1
Хіба це не зачепить усе, що знаходиться в каталозі вмісту? Я хочу лише перенаправити окремий елемент. Наприклад, у мене є ще один елемент у каталозі вмісту, але він мені потрібен для переадресації на ... / another-new-name / unique-page-
name2

1
Я це вирішив. Виявляється, це перенаправлення правильно, але сценарій ударів маніпулює URL після.
SteveEdson

1
Ах, я неправильно зрозумів питання. Я думав, ти хочеш змінити лише змістову частину. Принцип залишається тим самим. Я радий, що це працює на тебе.
Gevable

1
Немає жодних проблем, дякую за допомогу, але мені, безумовно, потрібно буде скористатися цим у майбутньому.
SteveEdson

12

Я використовував таке рішення:

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

Працює частування.


8

Для мене це працювало без знака рівності, як це:

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

2
Блок локації вам взагалі не потрібен. Просто використовуйте rewrite. Дивіться відповідь @ SteveEdison.
PKHunter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.