cvs diff: Diffing . cvs diff: Diffing includes cvs diff: Diffing includes/database cvs diff: Diffing includes/database/mysql cvs diff: Diffing includes/database/pgsql cvs diff: Diffing includes/database/sqlite cvs diff: Diffing includes/filetransfer cvs diff: Diffing misc cvs diff: Diffing misc/farbtastic cvs diff: Diffing misc/ui cvs diff: Diffing misc/ui/images cvs diff: Diffing modules cvs diff: Diffing modules/aggregator cvs diff: Diffing modules/aggregator/tests cvs diff: Diffing modules/block cvs diff: Diffing modules/blog cvs diff: Diffing modules/blogapi cvs diff: Diffing modules/book cvs diff: Diffing modules/color cvs diff: Diffing modules/color/images cvs diff: Diffing modules/comment cvs diff: Diffing modules/contact cvs diff: Diffing modules/dblog cvs diff: Diffing modules/field cvs diff: Diffing modules/field/modules cvs diff: Diffing modules/field/modules/field_sql_storage cvs diff: Diffing modules/field/modules/list cvs diff: Diffing modules/field/modules/number cvs diff: Diffing modules/field/modules/options cvs diff: Diffing modules/field/modules/text cvs diff: Diffing modules/field/theme cvs diff: Diffing modules/filter cvs diff: Diffing modules/forum cvs diff: Diffing modules/help cvs diff: Diffing modules/image cvs diff: Diffing modules/locale cvs diff: Diffing modules/locale/tests cvs diff: Diffing modules/locale/tests/translations cvs diff: Diffing modules/menu cvs diff: Diffing modules/node cvs diff: Diffing modules/node/tests cvs diff: Diffing modules/openid cvs diff: Diffing modules/openid/tests cvs diff: Diffing modules/path cvs diff: Diffing modules/php cvs diff: Diffing modules/poll cvs diff: Diffing modules/profile cvs diff: Diffing modules/search cvs diff: Diffing modules/simpletest cvs diff: Diffing modules/simpletest/files cvs diff: Diffing modules/simpletest/tests cvs diff: Diffing modules/statistics cvs diff: Diffing modules/syslog cvs diff: Diffing modules/system cvs diff: Diffing modules/taxonomy cvs diff: Diffing modules/toolbar cvs diff: Diffing modules/tracker cvs diff: Diffing modules/translation cvs diff: Diffing modules/trigger cvs diff: Diffing modules/trigger/tests cvs diff: Diffing modules/update cvs diff: Diffing modules/upload cvs diff: Diffing modules/user cvs diff: Diffing profiles cvs diff: Diffing profiles/default cvs diff: Diffing profiles/expert cvs diff: Diffing scripts cvs diff: Diffing sites cvs diff: Diffing sites/all cvs diff: Diffing sites/all/modules cvs diff: Diffing sites/all/themes cvs diff: Diffing sites/default cvs diff: Diffing themes cvs diff: Diffing themes/engines cvs diff: Diffing themes/engines/phptemplate cvs diff: Diffing themes/garland cvs diff: Diffing themes/garland/color cvs diff: Diffing themes/garland/images cvs diff: Diffing themes/garland/minnelli cvs diff: Diffing themes/garland/minnelli/color cvs diff: Diffing themes/seven cvs diff: Diffing themes/seven/images cvs diff: Diffing themes/stark Index: includes/menu.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/menu.inc,v retrieving revision 1.331 diff -u -p -r1.331 menu.inc --- includes/menu.inc 30 Jul 2009 10:16:48 -0000 1.331 +++ includes/menu.inc 10 Aug 2009 18:18:42 -0000 @@ -406,6 +406,11 @@ function menu_execute_active_handler($pa return MENU_ACCESS_DENIED; } } + $current_path = isset($path) ? $_GET['q'] : NULL; + $page_not_found = module_invoke_all('page_not_found', $current_path); + if (isset($page_not_found) && is_array($page_not_found) && isset($page_not_found['status_code'])) { + return $page_not_found['status_code']; + } return MENU_NOT_FOUND; } Index: modules/menu/menu.api.php =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.api.php,v retrieving revision 1.9 diff -u -p -r1.9 menu.api.php --- modules/menu/menu.api.php 11 Jul 2009 13:56:21 -0000 1.9 +++ modules/menu/menu.api.php 10 Aug 2009 18:18:42 -0000 @@ -148,5 +148,36 @@ function hook_translated_menu_link_alter } /** + * Execute this hook when the current path would result in a 'page not found' + * response. + * + * This hook may be used, for example, to load balance files located on + * different servers, or to check a subdomain for a path to redirect to. + * + * The menu return status can be changed by returning an array with the key + * 'status_code' set to the desired constant. + * + * @see menu.inc + * + * @param $path + * The system path which was not found. + * + * @return + * An optional array containing a 'status_code' key corresponding to a menu + * return constant from menu.inc. + */ +function hook_page_not_found($path) { + // Example - determine if the URL is available at a different site, and + // redirect if that URL is available. + $remote_url = variable_get('offsite_redirect_site', FALSE); + if ($remote_url) { + $result = drupal_http_request($remote_url . $path); + if (floor($result->code / 100) * 100 == 200 || floor($result->code / 100) * 100 == 300) { + drupal_goto($remote_url . $path); + } + } +} + +/** * @} End of "addtogroup hooks". */