Оригинал: Migrating the Drupal way. Part II: saving those old URLs. Kevin Hankens
Во второй части рассуждений о миграции, я хочу остановиться на важности сохранения набора URL-адресов при переносе со старого сайта и показать примеры того, как это можно сделать в Drupal. Переходы через поисковые системы и другие переходы имеют неоценимое значение, когда речь заходит об успехе сайта. Я поддерживаю в одиночку сайты, которые выдерживают свыше 100000 обращений в день с Google. Не говоря уже о всех внешних ссылках и закладках на ваших страницах. Если вы думаете о миграции на Drupal и не рассмотрели способов сохранения старых адресов URL, вам определенно следует задуматься над этим. Последствия утраты переходов на ваши страницы могут быть катастрофическими, но к счастью решение является достаточно простым.
Читать далее оригинал: Migrating the Drupal way. Part II: saving those old URLs. Kevin Hankens
Комментарии
К сожалению, автор проигнорировал (может и умышленно) проблему однозначного соответствия старых ID и NID. Ведь при импорте старых материалов мы не сможем задать NID - они выдаются базой данных и если в цепочке старых ID был провал (например, если вы удалили часть материалов), то в БД Друпала этого провала уже не будет.
Итак, как же сохранить работоспособность всех старых ссылок? Можно было бы выдавать перехватывать обращения по ним, генерируя сообщение "404 Not Found", однако это неудобно для пользователей и однозначно понизит ваши позиции в выдаче поисковых систем.
К счастью, небольшая настройка позволит перенаправить посетителей в нужное место на обновленном сайте. Ниже мы приведем несколько настроек для сохранения адреса на сайте с помощью расширения mod_rewrite для веб-сервера Apache и нескольких модулей Drupal.
Переход с ранее используемых ID к NID Друпала
Если каким-то образом вам удалось составить «карту» соответсвтия старых ID и новых NID, можно использовать mod_rewrite для перенаправления. Допустим, старый адрес выглядел как http://example.com/index.asp?id=123, а новый сайт использует URL типа http://example.com/node/123. Включение следующих правил в файл .htaccess позволит перенаправить посетителя к новому урл с корректным http-заголовком 301.
RewriteCond %{REQUEST_URI} ^/index.asp$
# Match a query string like id=[some number] and capture that number
RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
# Rewrite a Drupal friendly URL using the captured number
# Note that %1 is a backreference from a RewriteCond
# where $1 is a backreference from a RewriteRule
RewriteRule ^.*$ index.php?q=node/%1 [L]
Вы можете смело выкинуть первое правило RewriteCond, тогда будет производиться захват любого URL, оканчивающегося на "?ID=[некое число]". В принципе для Apache все равно, что делать с расширением .ASP, он однозначно будет перенаправлять все запросы к index.php.
Заметим, что мы не рассматриваем здесь вопрос соответствия старых ID новым NID. Расскажем об этом как-нибудь потом.
Создание индивидуальных URL-псевдонимов в Drupal
Возможно, вы не захотите использовать mod_rewrite для обработки адресов. Это может перегрузить сервер или вы не сможете составить однозначную таблицу соответствий ID->NID. В этом случае можно использовать модуль Path, входящий в дистрибутив Drupal, и добавить псевдонимы для адресов, генерируемых по умолчанию. Чтобы создать псеводним вручную, перейдите по ссылкам Управление -> Конструкция -> Псевдонимы -> Добавить. Так, например, можно добавить (старый) псевдоним 2008/12/12/my-seo-page.html для страницы node/5 в Друпал:
Если вам нечем заняться в ближайшие годы, можете задать псевдонимы для каждого материала вручную при его редактировании.
Программное решение
Приведенный выше пример использования модуля Path хорош, когда нужно создать псевдонимы лишь для нескольких страниц. Но подумайте что будет, если нам надо перенести 250000 страниц. К счастью, псевдонимы можно создавать программным способом, «налету», прямо в скрипте импорта, используя функцию Друпал path_set_alias().
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$node = new stdClass();
// Here you would look up your old article information and populate the node object.
$node->title = $old_title; // etc.
// Next you would want to create some logic to reconstruct your old URL
// example.com/2008/10/18/my-old-url.html -- use:
$old_url = "2008/10/18/my-old-url.html";
// Save the node in the database
node_save($node);
// Save the new alias based on your old URL
if ($node->nid) {
path_set_alias('node/' . $node->nid, $old_url, NULL, 'en');
}