Как прописать много редиректов конкретных страниц?
Есть сайт, состоящий из отдельных html-страниц, с ничего не значащими какими попало названиями вроде index1.htm, index10.htm, index130.htm, Page1.html, page20.htm и т.п. Домен старше пяти лет, уникальный контент, очень хорошие позиции в поисковиках.
И есть новая версия сайта — на CMS с ЧПУ, примерно половину страниц новой версии можно конкретно сопоставить со старой, для чего заказчиком составлена аккуратная табличка
index117.htm — /news/
index5.htm — /news/novost-pro-chto-to-konkretnoye/
... и так далее. Никаких совпадений в адресах старого и нового сайта нет — просто потому, что это маразм, сохранять все эти нумерованные индексы и пэйджи на CMS с ЧПУ.
Новая версия пока на субдомене, на сервере апач и nginx как прокси на фронтэнде.
Старый сайт на этот сервер переноситься не будет — просто будет переключен домен на новый IP.
Все соответствия страниц надо прописать в виде 301-х редиректов.
Думаю, лучше сделать это в nginx? Как это правильно сделать? Все примеры для nginx, которые удалось нагуглить — почему-то содержат в адресе, на который надо перенаправить, и протокол и домен (http://site.ru/new-page/). А можно прописывать без протокола и домена?
А если все-таки это надо делать в апаче — то почему?
Я делал это на уровне PHP. Собрал массив ассоциативный, где ключ - старый адрес, а значение - новый. И далее в обработчике 404 ошибки в начало помещал условие, что если элемент с ключом, соответствующим текущему запросу, найден в том массиве, то делается редирект.
Пример кода:
foreach ($links as $old_link => $new_link) {
if ($old_link == $_SERVER['REQUEST_URI']) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: $new_link");
}
}
Интересно, какое решение более быстрое / менее ресурсоемкое? Мне все-таки кажется, что если прописать редиректы «в лоб» в конфиге nginx (отдельный для каждой страницы) — будет менее ресурсоемко и быстрее работать?
Пример добавил в ответ.
Если прописать редиректы в лоб, то, если я верно понял, что планируется прописывать, при каждом запросе страницы она будет проверяться на наличие в списке редиректов. А если повесить проверку на обработчик 404 ошибки, то проверяться список будет только если запрошенная страница не найдена.
Редирект нужен только для поисковиков, пока они не переиндексируют, и для поддержки работоспособности ссылок с других сайтов. Это вряд ли будет узким местом в производительности, так зачем городить сложные системы?
Лучше конечно делать проверки на стороне сервера, чем на пхп, но в данном случаи вариант с 404 страницей на мой взгляд лучше.
Только нужно не забывать, что 404 отдается на правильном сервере с 404 кодом, а дальнейший редирет выглядит странно, не уверен как это поймут роботы.
@ScorpLeX Код состояния HTTP только один. Если произошел редирект, то будет 301. Скрипт выполняется до того, как начали отдаваться заголовки и контент, если редиректа не произошло (не найден адрес в списке старых), то 404-обработчик тогда доделает свою работу, вернет 404 код и отдаст контент об ошибке.
А что если использовать алиасы (без редиректа) на эти страницы (если есть такая возможность в CMS на одну страницу несколько адресов вешать).
Просто далее можно было бы через canonical url указывать нужную версию.
Или не лучше?
@gwer если написать просто header("Location: $new_link"); то код будет 404. Не помню эту строку в вашем примере header("HTTP/1.1 301 Moved Permanently"); когда оставлял комментарий.
1. А автоматически такой редирект сделать не получится?
2. Нужно все равно ручками прописывать старые и новые адреса?
1. Если таких адресов более 700, то по другому никак не получится, кроме как "вручную"?