How to redirect based on matching a node field? This question is somewhat similar to How to redirect based on views results? which I think gives me part of the answer I want.  Basically my situation is this:

I am migrating from an old xoops system which had its own set of content ids.  I want to seamlessly make the switch to this new drupal system, meaning the old urls work, but redirect to their new pathauto equivalents.

By way of explanation, say the old url was /view.php?docid=6252 and the new address should be /pubs/capacity_building_climate_change_impact_assessment which has been generated by pathauto.

I can do a redirect at the web server level to get from /view.php?docid=6252' to/pub/6252`.

I have brought over the legacy document id, as a field on the new nodes, and I have a view working where I can visit /pub/6252 and get the right content. Now I want to make sure that the pathauto url is the definitive one url to rule them all for that particular node. How can I redirect to the proper url based on that url segment matching the legacy document id field in a node. It would be nice if it could be done without bringing all of the overhead of a views lookup into it, but if redirecting from that view is the best way, so be it. Hopefully I can aggressively cache that view since that data should almost never change.

I downloaded the Redirect module, hoping that it provided some of that, especially since it claims integration with the views api, but I didn't immediately see anything helpful there, and there doesn't seem to be any documentation for it.
Non-Views Answer

I finally figured out how this can be done without incurring the overhead of views.  I'll leave the views answer below in case it is useful for someone, but this version seems snappier to me.  As always, critique very welcome!

/**
 * Implements hook_menu().
 */
function MYMODULE_menu()
{
    $items = array();
    $items['pub'] = array(
        'title' =&gt; 'publications by Docid',
        'access callback' =&gt; TRUE,
        'page callback' =&gt; '_MYMODULE_pub_to_docid',
    );
    return $items;
}


/**
 * Redirect to a publication page based on its legacy_docid
 */
function _MYMODULE_pub_to_docid() {
    $path = current_path();
    $path = str_ireplace('pub/', '', $path);
    $args = explode('/', $path);
    $query = new EntityFieldQuery();
    if (_MYMODULE_isInteger($args[0])) { // Sanity check, local helper function just to check that the value is an integer.
        $query-&gt;entityCondition('entity_type', 'node')
            -&gt;fieldCondition('field_doc_legacy_docid', 'value', $args[0]);
        $result = $query-&gt;execute();
        if (isset($result['node']) &amp;&amp; count($result['node'] == 1)) {
            $node_holder = array_slice($result['node'],0,1)[0];
            $node = node_load($node_holder-&gt;nid);
            $language = language_list()[$node-&gt;language];
            drupal_goto(drupal_get_path_alias('node/'.$node_holder-&gt;nid, $node-&gt;language), array('language' =&gt; $language), 301);
        } else {
            return MENU_NOT_FOUND;
        }
    }
    return MENU_NOT_FOUND;

}


Views Answer

Here is a views answer, but I'd still like to know if there is a better or preferred way of doing this.  I added a function in my_module:

function my_module_views_pre_render(&amp;$view) {

  if ($view-&gt;name=='staff_views') { // user redirect
    drupal_goto(drupal_get_path_alias('user/'.$view-&gt;result[0]-&gt;uid));
  }
  if ($view-&gt;name=='pub_by_docid') {
      if (count($view-&gt;result) == 1) {
          $node = node_load($view-&gt;result[0]-&gt;nid);
          $language = language_list()[$node-&gt;language];
          drupal_goto(drupal_get_path_alias('node/'.$view-&gt;result[0]-&gt;nid, $node-&gt;language), array('language' =&gt; $language), 301);
      }

  }
}


Note that this function is actually redirecting for a view that matches users based on their legacy user id first, and then for a view that matches document id as mentioned originally in my question.

Update: I've updated the code here to reflect the suggestion from J. Reynolds that I include a http response code of 301 to avoid drupals default of 302.  

I also found that to get things to work for non-English publications, I needed to add a language option to drupal_goto(), which needs to be a language object.  That is the reason for the line creating the $language variable.