Skip to content
uri_map_redirect.php 3.25 KiB
Newer Older
<?php

/**
 * @file
 * Sample file for handling redirection from old to new URIs. Use an Apache
Moshe Weitzman's avatar
Moshe Weitzman committed
 * rewrite rule (or equivalent) to map legacy requests to this file. To use, copy
 * or symlink this file to the root of your drupal site. Customize
 * this file to your needs.
 *
 * CREATE TABLE `migrate_source_uri_map` (
 * `source_uri` varchar(255) NOT NULL DEFAULT '',
 * `migration_name` varchar(255) NOT NULL,
 *  `source_id` int(11) NOT NULL, -- can be varchar for some migrations
 * PRIMARY KEY (`source_uri`)
 * )
 *
// For security, this script is disabled by default.
die('Comment out this line when you are ready to use this script');
// Based on custom patterns, build the destination_uri for given source_uri
function migrate_build_url($destid1, $migration_name) {
  global $base_url;
  // TODO: Add an entry for each migration that we need to redirect.
  $patterns = variable_get('migrate_patterns', array(
    'BeerTerm' => 'taxonomy/term/:source_id',
    'BlogEntries' => 'node/:source_id',
    'Slideshows' => 'node/:source_id',
    'TagTerm' => 'taxonomy/term/:source_id',
  ));
  $pattern = $patterns[$migration_name];
  // Swap in the destination ID.
  $destination_uri = str_replace(':source_id', $destid1, $pattern);
  // For speed, we go right to aliases table rather than more bootstrapping.
  if ($uri_clean = db_query("SELECT alias FROM {url_alias} WHERE source = :destination_uri", array(':destination_uri' => $destination_uri))->fetchField()) {
    $destination_uri = $uri_clean;
  // Build absolute url for 301 redirect.
  return  $base_url . '/' . $destination_uri;
}
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
// Only bootstrap to DB so we are as fast as possible. Much of the Drupal API
// is not available to us.
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
// You must populate this querystring param from a rewrite rule or $_SERVER
// On Apache, we could likely use _SERVER['REDIRECT_URL']. nginx?
if (!$source_uri = $_GET['migrate_source_uri']) {
  print '$_GET[migrate_source_uri] was not found on the request.';
  exit();
}

// This is a tall table mapping legacy URLs to source_id and migration_name.
// If you can already know the migration name and source_id based on the URI,
// then the first lookup is not needed.
$uri_table = variable_get('migrate_source_uri_table', 'migrate_source_uri_map');

if ($uri_map = db_query("SELECT migration_name, source_id FROM $uri_table WHERE source_uri = :source_uri", array(':source_uri' => $source_uri))->fetchObject()) {
  // Hurray, we do recognize this URI.
  // Consult migrate_map_x table to determine corresponding Drupal nid/tid/cid/etc.
  $map_table = 'migrate_map_' . strtolower($uri_map->migration_name);
  $sql = "SELECT destid1 FROM $map_table WHERE sourceid1 = :source_id";
  if ($destid1 = $migrate_map = db_query($sql, array(':source_id' => $uri_map->source_id))->fetchField()) {
    // Hurray. We already migrated this content. Go there.
    header('Location: ' . migrate_build_url($destid1, $uri_map->migration_name), TRUE, 301);
  }
  else {
    // We recognize URI but don't have the content in Drupal. Very unlikely.
}
else {
  // Can't find the source URI. TODO: Make nice 404 page.
  header('Status=Not Found', TRUE, 404);
  print 'Sorry folks. Park is closed.';
}