home | career | drupal | java | mac | mysql | perl | php | scala | uml | unix

Drupal example source code file (globalredirect.module)

This example Drupal source code file (globalredirect.module) is included in the DevDaily.com "Drupal Source Code Warehouse" project. The intent of this project is to help you "Learn Drupal by Example".

PHP - Drupal tags/keywords

301, alias, alias_sensitive, array, function, if, menu_check, null, php, prefix, query_string, request, return, string

The globalredirect.module Drupal example source code

<?php
// $Id: globalredirect.module,v 1.1.2.4.2.5.2.14 2008/12/22 10:34:32 njt1982 Exp $

/**
 * @file
 * The Global Redirect module redirects for all paths which have aliases but are not using the aliases which reduces the risk of duplicate content
 */


define('GLOBALREDIRECT_FEATURE_DISABLED', -1);

define('GLOBALREDIRECT_TRAILINGZERO_TAXTERM', 1);
define('GLOBALREDIRECT_TRAILINGZERO_ALL', 2);

define('GLOBALREDIRECT_NONCLEAN2CLEAN_ENABLED', 1);

define('GLOBALREDIRECT_CASE_SENSITIVE_URLS_ENABLED', 1);

define('GLOBALREDIRECT_DESLASH_ENABLED', 1);

define('GLOBALREDIRECT_MENU_CHECK_ENABLED', 1);

/**
 * Implementation of hook_help().
 */
function globalredirect_help($section) {
  switch ($section) {
    case 'admin/modules#description':
      return t('This module will do a 301 redirect for all nodes which have an alias but are not using that alias.');
  }
}


/**
 * Implementation of hook_init().
 */
function globalredirect_init() {
  global $language;

  /**
   * We need to do a test to make sure we only clean up URL's for the main request. This stops modules such as
   * the Ad Module which had its own script in its folder doing a bootstrap which invoked hook_init and caused some banners to get "cleaned up"
   * See issues: http://drupal.org/node/205810 and http://drupal.org/node/278615
   */
  if ($_SERVER['SCRIPT_NAME'] != $GLOBALS['base_path'] .'index.php') return FALSE;

  /**
   * If the site is in offline mode there is little point doing any of this as you might end up redirecting to a 503.
   */
  if (variable_get('site_offline', 0) == 1) return FALSE;

  /**
   * Use of menu_get_item should be optional as it appears in some situations it causes WSOD's...
   */
  $menu_check = variable_get('globalredirect_menu_check', GLOBALREDIRECT_FEATURE_DISABLED);


  /**
   * We need to make sure this hook only fires in certain conditions:
   *   1) If the 'drupal_get_path' function exists. Sometimes hook_init gets called twice, the first call hasn't included path.inc.
   *   2) If there is a request. There is no point checking the REAL frontpage for an alias.
   *   3) If the $_POST is empty. The problem which arises here is if a form posts to an source path rather than the alias. GlobalRedirect sometimes interrupts the post and redirects to the alias instead.
   */

  if (function_exists('drupal_get_path_alias') &&
      ($menu_check == GLOBALREDIRECT_FEATURE_DISABLED || ($menu_check == GLOBALREDIRECT_MENU_CHECK_ENABLED && function_exists('menu_get_item'))) &&
      isset($_REQUEST['q']) &&
      empty($_POST)) {

    // If menu checking is enabled, do the check. Feature disabled by default.
    if ($menu_check == GLOBALREDIRECT_MENU_CHECK_ENABLED) {
      // Check the access on the current path, return FALSE if access not allowed. This stops redirection for paths without access permission.
      $item = menu_get_item();
      _menu_check_access($item, $item['map']);
      if (!$item['access']) return FALSE;
    }

    // Store the destination from the $_REQUEST as it breaks things if we leave it in - restore it at the end...
    if (isset($_REQUEST['destination'])) {
      $destination = $_REQUEST['destination'];
      unset($_REQUEST['destination']);
    }

    // Get the Query String (minus the 'q'). If none set, set to NULL
    $query_string = drupal_query_string_encode($_GET, array('q'));
    if (empty($query_string)) {
      $query_string = NULL;
    }

    // Establish the language prefix that should be used, ie. the one that drupal_goto() would use
    $options = array('prefix' => '');
    if (function_exists('language_url_rewrite')) {
      // Note that language_url_rewrite() takes path (by reference) as the first argument but does not use it at all
      $path = $_REQUEST['q'];
      language_url_rewrite($path, $options);
    }
    $prefix = rtrim($options['prefix'], '/');


    // Do a check if this is a frontpage
    if (drupal_is_front_page()) {
      // Redirect if the current request does not refer to the frontpage in the configured fashion (with or without a prefix)
      if ($_REQUEST['q'] != $prefix) {
        drupal_goto('', $query_string, NULL, 301);
      }
      // If we've got to this point then we're on a frontpage with a VALID request path (such as a language-prefix frontpage such as '/de')
      return;
    }

    // Trim any trailing slash off the end (eg, 'node/1/' to 'node/1')
    $redirect_slash = variable_get('globalredirect_deslash', GLOBALREDIRECT_DESLASH_ENABLED) == GLOBALREDIRECT_DESLASH_ENABLED;
    $request = $redirect_slash ? trim($_GET['q'], '/') : $_GET['q'];

    // Optional stripping of "/0". Defaultly disabled
    switch (variable_get('globalredirect_trailingzero', GLOBALREDIRECT_FEATURE_DISABLED)) {
      case GLOBALREDIRECT_TRAILINGZERO_TAXTERM :
        // If 'taxonomy/term/*' only. If not, break out.
        if (drupal_substr($request, 0, 14) != 'taxonomy/term/') {
          break;
        }
        // If it is, fall through to general trailing zero method
      case GLOBALREDIRECT_TRAILINGZERO_ALL :
        // If last 2 characters of URL are /0 then trim them off
        if (drupal_substr($request, -2) == '/0') {
          $request = rtrim($request, '/0');
        }
    }


    // Find an alias (if any) for the request
    $alias = drupal_get_path_alias($request);
    if ($prefix && $alias) {
      $prefix .= '/';
    }

    // Alias case sensitivity check. If there is an alias from the previous lookup, do a query to test for case.
    if ($alias && variable_get('globalredirect_case_sensitive_urls', GLOBALREDIRECT_CASE_SENSITIVE_URLS_ENABLED) == GLOBALREDIRECT_CASE_SENSITIVE_URLS_ENABLED) {
      $alias_sensitive = db_result(db_query("SELECT dst FROM {url_alias} WHERE dst = '%s'", $alias));
      if ($alias_sensitive && $alias != $alias_sensitive) {
        // There is a match and there is a difference in case.
        $alias = $alias_sensitive;
      }
    }

    // Compare the request to the alias. This also works as a 'deslashing' agent. If we have a language prefix then prefix the alias
    if ($_REQUEST['q'] != $prefix . $alias) {
      // If it's not just a slash or user has deslash on, redirect
      if (str_replace($prefix . $alias, '', $_REQUEST['q']) != '/' || $redirect_slash) {
        drupal_goto($alias, $query_string, NULL, 301);
      }
    }

    // If no alias was returned, the final check is to direct non-clean to clean - if clean is enabled
    if ((variable_get('globalredirect_nonclean2clean', GLOBALREDIRECT_NONCLEAN2CLEAN_ENABLED) == GLOBALREDIRECT_NONCLEAN2CLEAN_ENABLED) && ((bool)variable_get('clean_url', 0)) && strpos(request_uri(), '?q=')) {
      drupal_goto($request, $query_string, NULL, 301);
    }

    // Restore the destination from earlier so its available in other places.
    if (isset($destination)) $_REQUEST['destination'] = $destination;
  }
}


/**
 * Implementation of hook_menu().
 */
function globalredirect_menu() {
  $items = array();

  $items['admin/settings/globalredirect'] = array(
    'title' => 'Global Redirect',
    'description' => 'Chose which features you would like enabled for Global Redirect',
    'access callback' => 'user_access',
    'access arguments' => array('administer site configuration'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('globalredirect_settings'),
    'file' => 'globalredirect.admin.inc',
  );

  return $items;
}

Other Drupal examples (source code examples)

Here is a short list of links related to this Drupal globalredirect.module source code file:

new blog posts

"Drupal" is a registered trademark of Dries Buytaert.

my drupal tutorials and examples  

Copyright 1998-2016 Alvin Alexander, alvinalexander.com
All Rights Reserved.

Beginning in 2016, a portion of the proceeds from pages under the '/drupal-code-examples/' URI will be donated to charity.