Community Documentation

drupal_goto

5 common.inc drupal_goto($path = '', $query = NULL, $fragment = NULL, $http_response_code = 302)
6 common.inc drupal_goto($path = '', $query = NULL, $fragment = NULL, $http_response_code = 302)
7 common.inc drupal_goto($path = '', array $options = array(), $http_response_code = 302)
8 common.inc drupal_goto($path = '', array $options = array(), $http_response_code = 302)

Send the user to a different Drupal page.

This issues an on-site HTTP redirect. The function makes sure the redirected URL is formatted correctly.

Usually the redirected URL is constructed from this function's input parameters. However you may override that behavior by setting a <em>destination</em> in either the $_REQUEST-array (i.e. by using the query string of an URI) or the $_REQUEST['edit']-array (i.e. by using a hidden form field). This is used to direct the user back to the proper page after completing a form. For example, after editing a post on the 'admin/content/node'-page or after having logged on using the 'user login'-block in a sidebar. The function drupal_get_destination() can be used to help set the destination URL.

Drupal will ensure that messages set by drupal_set_message() and other session data are written to the database before the user is redirected.

This function ends the request; use it rather than a print theme('page') statement in your menu callback.

Parameters

$path: A Drupal path or a full URL.

$query: The query string component, if any.

$fragment: The destination fragment identifier (named anchor).

$http_response_code: Valid values for an actual "goto" as per RFC 2616 section 10.3 are:

  • 301 Moved Permanently (the recommended value for most redirects)
  • 302 Found (default in Drupal and PHP, sometimes used for spamming search engines)
  • 303 See Other
  • 304 Not Modified
  • 305 Use Proxy
  • 307 Temporary Redirect (an alternative to "503 Site Down for Maintenance")

Note: Other values are defined by RFC 2616, but are rarely used and poorly supported.

See also

drupal_get_destination()

▾ 34 functions call drupal_goto()

aggregator_admin_refresh_feed in modules/aggregator/aggregator.module
Menu callback; refreshes a feed, then redirects to the overview page.
comment_admin_overview_validate in modules/comment/comment.module
We can't execute any 'Update options' if no comments were selected.
comment_multiple_delete_confirm in modules/comment/comment.module
List the selected comments and verify that the admin really wants to delete them.
comment_multiple_delete_confirm_submit in modules/comment/comment.module
Perform the actual comment deletion.
comment_reply in modules/comment/comment.module
This function is responsible for generating a comment reply form. There are several cases that have to be handled, including:
contact_admin_delete in modules/contact/contact.module
Category delete page.
drupal_redirect_form in includes/form.inc
Redirect the user to a URL after a form has been processed.
filter_admin_delete in modules/filter/filter.module
Menu callback; confirm deletion of a format.
legacy_blog_feed in modules/legacy/legacy.module
Menu callback; redirects users to new blog feed paths.
legacy_taxonomy_feed in modules/legacy/legacy.module
Menu callback; redirects users to new taxonomy feed paths.
legacy_taxonomy_page in modules/legacy/legacy.module
Menu callback; redirects users to new taxonomy page paths.
locale_admin_manage_delete_form in modules/locale/locale.module
User interface for the language deletion confirmation screen.
menu_confirm_disable_item_submit in modules/menu/menu.module
node_configure_validate in modules/node/node.module
Form validate callback.
node_page_edit in modules/node/node.module
Menu callback; presents the node editing form, or redirects to delete confirmation.
node_revision_delete in modules/node/node.module
Delete the revision with specified revision number. A "delete revision" nodeapi event is invoked when a revision is deleted.
node_revision_revert in modules/node/node.module
Revert to the revision with the specified revision number. A node and nodeapi "update" event is triggered (via the node_save() call) when a revision is reverted.
poll_cancel in modules/poll/poll.module
Callback for canceling a vote
poll_vote in modules/poll/poll.module
Callback for processing a vote
search_admin_settings_validate in modules/search/search.module
Validate callback.
search_view in modules/search/search.module
Menu callback; presents the search form and/or search results.
system_admin_compact_page in modules/system/system.module
system_modules_uninstall_submit in modules/system/system.module
Processes the submitted uninstall form.
system_modules_uninstall_validate in modules/system/system.module
Validates the submitted uninstall form.
system_run_cron in modules/system/system.module
Menu callback: run cron manually.
user_admin_role in modules/user/user.module
Menu callback: administer roles.
user_edit in modules/user/user.module
user_login in modules/user/user.module
user_logout in modules/user/user.module
Menu callback; logs the current user out, and redirects to the home page.
user_menu in modules/user/user.module
Implementation of hook_menu().
user_pass_reset in modules/user/user.module
Menu callback; process one time login link and redirects to the user page on success.
user_register in modules/user/user.module
_locale_string_delete in includes/locale.inc
Delete a language string.
_locale_string_edit in includes/locale.inc
User interface for string editing.

File

includes/common.inc, line 303
Common functions that many Drupal modules will need to reference.

Code

<?php
function drupal_goto($path = '', $query = NULL, $fragment = NULL, $http_response_code = 302) {

  $destination = FALSE;
  if (isset($_REQUEST['destination'])) {
    $destination = $_REQUEST['destination'];
  }
  else if (isset($_REQUEST['edit']['destination'])) {
    $destination = $_REQUEST['edit']['destination'];
  }

  if ($destination) {
    // Do not redirect to an absolute URL originating from user input.
    $colonpos = strpos($destination, ':');
    $absolute = ($colonpos !== FALSE && !preg_match('![/?#]!', substr($destination, 0, $colonpos)));
    if (!$absolute) {
      extract(parse_url(urldecode($destination)));
    }
  }

  $url = url($path, $query, $fragment, TRUE);
  // Remove newlines from the URL to avoid header injection attacks.
  $url = str_replace(array("\n", "\r"), '', $url);

  // Before the redirect, allow modules to react to the end of the page request.
  module_invoke_all('exit', $url);

  // Even though session_write_close() is registered as a shutdown function, we
  // need all session data written to the database before redirecting.
  session_write_close();

  header('Location: ' . $url, TRUE, $http_response_code);

  // The "Location" header sends a REDIRECT status code to the http
  // daemon. In some cases this can go wrong, so we make sure none
  // of the code below the drupal_goto() call gets executed when we redirect.
  exit();
}
?>
Login or register to post comments