/
Configuring settings.php on Pantheon

Configuring settings.php on Pantheon

Local Environment

Kalabox

If you are using Kalabox, you should have some basic conditionals that setup your settings.php to operate on Pantheon and your local Kalabox:

/**
 * Terminatur
 *
 * These local settings were generated by terminatur.
 * You may see them if you use Kalastack, Kalabox, Proviso or other local dev
 * tools.
 *
 */
if (isset($_SERVER['KALABOX']) &&  $_SERVER['KALABOX'] === 'on') {
  // DB Array and some common conf.
  $databases['default']['default'] = array(
    'driver' => 'mysql',
    'database' => 'mysite_kala',
    'username' => 'root',
    'password' => 'password',
    'host' => 'localhost',
    'port' => '3306',
    'prefix' => '',
  );
  
  // Error reporting
  error_reporting(-1);  // Have PHP complain about absolutely everything.
  $conf['error_level'] = 2;  // Show all messages on your screen
  ini_set('display_errors', TRUE);  // These lines give you content on WSOD pages.
  ini_set('display_startup_errors', TRUE);

  // Set some common desirable local vars.
  $conf['file_temporary_path'] = '/tmp';
  $conf['file_public_path'] = 'sites/default/files';
  $conf['file_private_path'] = 'sites/default/files/private';
  $conf['reroute_email_enable'] = 1;

  $conf['cache'] = 0;
  $conf['css_gzip_compression'] = FALSE;
  $conf['js_gzip_compression'] = FALSE;
  $conf['preprocess_css'] = 0;
  $conf['preprocess_js'] = 0;
  $conf['site_name'] = 'mysite Local';
  $conf['cron_last'] = '9999999999';
}

 

Non-Kalabox

If you aren't on Kalabox, you should setup something similar. Make sure you don't overwrite any of the existing Kalabox settings or Pantheon configuration:

if (isset($_SERVER['KALABOX']) &&  $_SERVER['KALABOX'] === 'on') {
 // Kalabox stuff from above would be here.
} else {
 // Your custom local environment db configuration and the sane defaults
 // shown in the Kalabox config above should be here.
}

301 Redirect to Single Domain

On most sites that are going live, we'll want to make sure all requests are directed to a single domain for ideal SEO and user experience. We do this with a permanent 301 redirect.

In this example, we're making sure that the default Pantheon domain AND www.mysite.com are redirected to the non-www domain:

if (isset($_SERVER['PANTHEON_ENVIRONMENT'])) {
  if($_SERVER['PANTHEON_ENVIRONMENT'] === 'live') {
    // settings for launching Featured Events
    if($_SERVER['HTTP_HOST'] == 'live-mysite.gotpantheon.com' || $_SERVER['HTTP_HOST'] == 'www.mysite.com'){
      header('HTTP/1.0 301 Moved Permanently');
      header('Location: http://mysite.com'. $_SERVER['REQUEST_URI']);
      exit();
    }
  }
}

 

Partial Redirects going to legacy site with a new site (Kettering did this)

// REDIRECTS
if (isset($_SERVER['PANTHEON_ENVIRONMENT'])) {
  // Easily Change status code and base url for testing here:
  $host = 'my.kettering.edu';
  $http_code = 'HTTP/1.0 303 See Other';
  $redirect = FALSE;

  // Add URLS to skip this AKA 1-1:
  $skip = array(
    '/admissions',
  );

  // Set this to a var so we don't mess with doing all this fun stuff below.
  $uri = strtolower($_SERVER['REQUEST_URI']);

  // Redirect to legacy site based on set patterns, etc.
  if (!in_array($uri, $skip)) {
    // Wildcard Redirects.
    $wildcard = array(
      'academics',
      'alumni-donors',
      'current-students',
      'downloads',
      'emergency',
      'faculty-staff',
      'faculty',
      'ferpa',
      'it',
      'news',
      'office-administration',
      'offices-administration',
      'research',
    );

    // One to One from www.kettering.edu to my.kettering.edu
    $onetoone = array(
      '/archives',
      '/asc',
      '/Atwood',
      '/brand',
      '/businessOffice',
      '/career-services',
      '/cetl',
      '/commencement',
      '/communityservice',
      '/currentstudents',
      '/deans-list',
      '/dining',
      '/emergency',
      '/employee-information',
      '/events',
      '/ferpa',
      '/financialaid',
      '/financialAid',
      '/first',
      '/flintwater',
      '/get-word-out',
      '/give',
      '/greeklife',
      '/hr',
      '/keepmekettering',
      '/library',
      '/marcomm',
      '/nbs',
      '/Oldschool',
      '/phonathon',
      '/regbell',
      '/registrar',
      '/sharing-memories-professor-bell',
      '/studentlife',
      '/trustee-rsvp',
      '/water',
      '/wellness-center',
    );

    // String Match Redirects.
    $string_checks = array(
      '/about/accreditation-and-assessment',
      '/sites/default/files/resource-file-download',
    );

    // Time to make the magic happen.
    $uri_check = explode('/', $_SERVER['REQUEST_URI']);

    // Check for Wildcard Redirect || 1 to 1 www to my first.
    if ((isset($uri_check[1]) && in_array($uri_check[1], $wildcard)) ||
        (in_array($uri, $onetoone))) {
      $redirect = TRUE;
    }
    // Redirect to specific legacy pages or paths.
    elseif (isset($uri_check[1])) {
      // Change the URI or HOST based of the base uri path.
      switch ($uri_check[1]) {
        case 'alumni':
          $redirect = TRUE;
          $uri = '/alumni-donors/get-involved';
          break;
        case 'directory':
          $redirect = TRUE;
          $uri = '/faculty-staff/directory';
          break;
        case 'giving':
          $redirect = TRUE;
          $uri = '/give';
          break;
        case 'aanouncements':
          $redirect = TRUE;
          $uri = '/announcements';
          break;
        case 'partnerships':
          $redirect = TRUE;
          $uri = '/alumni-donors';
          break;
        case '~':
          $redirect = TRUE;
          $host = 'paws.kettering.edu';
          break;
        case 'ug-admitted':
          $redirect = TRUE;
          $host = 'accepted.kettering.edu';
          break;
        case 'iamabulldog':
          $redirect = TRUE;
          $host = 'accepted.kettering.edu';
          break;
        case 'admissions':
          // This was the easiest way to handle all the admissions ones.
          $redirect = TRUE;
          unset($uri_check[1]);
          $uri = implode('/', $uri_check);
          $host = 'www.kettering.edu';
          break;
      }
      // Check for string paths.
      if (!$redirect) {
        foreach ($string_checks as $string_check) {
          if (strpos($uri, $string_check) !== FALSE) {
            $redirect = TRUE;
          }
        }
      }
    }
  }
  // If true above, lets have some fun redirects happen!
  if ($redirect) {
    header($http_code);
    header('Location: https://'. $host . $uri);
    exit();
  }
  else {
    // Regular redirects to current site.
    $old = array(
      'm.kettering.edu',
      'admissions.kettering.edu',
    );

    if ($_SERVER['PANTHEON_ENVIRONMENT'] === 'live' && $_SERVER['HTTPS'] === 'OFF') {
      if (!isset($_SERVER['HTTP_X_SSL']) ||
         (isset($_SERVER['HTTP_X_SSL']) && $_SERVER['HTTP_X_SSL'] != 'ON')) {
        header($header);
        header('Location: https://www.kettering.edu' . $_SERVER['REQUEST_URI']);
        exit();
      }
    }
    elseif ($_SERVER['PANTHEON_ENVIRONMENT'] === 'live' && in_array($_SERVER['HTTP_HOST'], $old)) {
      header($header);
      header('Location: https://www.kettering.edu'. $_SERVER['REQUEST_URI']);
      exit();
    }
    elseif ($_SERVER['HTTP_HOST'] == 'my.kettering.edu') {
      $newurl = 'https://www.kettering.edu/faculty-staff'. $_SERVER['REQUEST_URI'];
      header($header);
      header("Location: $newurl");
      exit();
    }
  }
}

 

Full Settings.php Sample

Here is an example portion of a settings.php with environmental magic on Pantheon

There is an example 404 redirect config, and a redirect for a path part to a subdomain.

Also, a placeholder for 301 redirects.

(warning) note that there are 2 different ways to check the Pantheon environment, here – one for config, the other for web actions like redirects.

setttings.php
<?php
 
// all other defaults go here
 

/*
* settings for all environements
*/
// Avoid Image resize threshold error
$conf['image_resize_filter_threshold'] = 1000;
// 7.21+ image hack for text-area images
// http://drupal.stackexchange.com/questions/63226/drupal-7-20-image-styles-return-a-url-with-access-denied
$conf['image_allow_insecure_derivatives'] = TRUE;

// if using PHP 5.5 as per https://pantheon.io/docs/articles/drupal/configuring-settings-php/#troubleshooting
ini_set('arg_separator.output', '&');
/**
 * Perform web-only operations on Pantheon like redirects
 * the $_SERVER array will not exist for the drush-cli
 * see http://helpdesk.getpantheon.com/customer/portal/articles/708588
 */
if (isset($_SERVER['PANTHEON_ENVIRONMENT'])) {
  /**
   * Redirect 404 config to the D6 site to hide D7 development
   * REMOVE ME ON LAUNCH
   */
  $conf['redrect_404_search'] = 'http://www.mysite.com/search/apachesolr_search';
  $conf['redirect_404_redirect'] = 'http://www.mysite.com';
  $conf['redirect_404_servers'] = 'http://www.mysite.com';

  if($_SERVER['PANTHEON_ENVIRONMENT'] === 'live') {
    // settings for launching Featured Events
    if($_SERVER['HTTP_HOST'] == 'live-mysite.gotpantheon.com'){
      header('HTTP/1.0 301 Moved Permanently');
      header('Location: http://new.mysite.com'. $_SERVER['REQUEST_URI']);
      exit();
    }
    // Events Launch
    // Redirect all traffic from the "events" subdomain that is not going to
    // an /events/* URI back to www.mysite.com (legacy D6 site).
    if($_SERVER['HTTP_HOST'] === 'events.mysite.com' && !preg_match('/^\/events\/.+/', $_SERVER['REQUEST_URI']) && !preg_match('/^\/event-speaker-details\//', $_SERVER['REQUEST_URI']) && !preg_match('/^\/sites\/.+/', $_SERVER['REQUEST_URI']) ) {
      header('HTTP/1.0 303 Temporary Redirect');
      header('Location: http://www.mysite.com'. $_SERVER['REQUEST_URI']);
      exit();
    }
    // // full launch
    // if (in_array($_SERVER['HTTP_HOST'], array(
    //   'live-mysite.gotpantheon.com',
    //   'mysite.org',
    //   'www.mysite.org',
    //   'new.mysite.com',
    //   'mysite.com',
    // ))) {
    //   header('HTTP/1.0 301 Moved Permanently');
    //   header('Location: http://www.mysite.com'. $_SERVER['REQUEST_URI']);
    //   exit();
    // }
  }

  if($_SERVER['PANTHEON_ENVIRONMENT'] === 'test') {
    if($_SERVER['HTTP_HOST'] == 'test-mysite.gotpantheon.com') {
      header('HTTP/1.0 301 Moved Permanently');
      header('Location: http://test.mysite.com'. $_SERVER['REQUEST_URI']);
      exit();
    }
  }
  if ($_SERVER['PANTHEON_ENVIRONMENT'] === 'dev') {
    // Error reporting
    error_reporting(-1);  // Have PHP complain about absolutely everything.
    $conf['error_level'] = 2;  // Show all messages on your screen
    ini_set('display_errors', TRUE);  // These lines give you content on WSOD pages.
    ini_set('display_startup_errors', TRUE);
   
    if($_SERVER['HTTP_HOST'] == 'dev-mysite.gotpantheon.com') {
      header('HTTP/1.0 301 Moved Permanently');
      header('Location: http://dev.mysite.com'. $_SERVER['REQUEST_URI']);
      exit();
    }
  }

}
/**
 * Perform web and drush operations on Pantheon
 * see http://helpdesk.getpantheon.com/customer/portal/articles/708588
 */
if (defined('PANTHEON_ENVIRONMENT')) {
  /**
   * Use Redis for caching AND performance settings
   * see http://helpdesk.getpantheon.com/customer/portal/articles/401317-redis
   */
  $conf['redis_client_interface'] = 'PhpRedis';
  $conf['cache_backends'][] = 'sites/all/modules/contrib/redis/redis.autoload.inc';
  $conf['cache_default_class'] = 'Redis_Cache';
  // Make sure that we don't have collisions by prefixing the cache keys per environment
  $conf['cache_prefix'] = array('default' => 'pantheon-redis-' . $_SERVER['PANTHEON_ENVIRONMENT'] );
  // Do not use Redis for cache_form (no performance difference).
  $conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
  // Don't use Redis for Views cache, has caused some display issues.
  $conf['cache_class_cache_views'] = 'DrupalDatabaseCache';
  $conf['cache_class_cache_views_data'] = 'DrupalDatabaseCache';
  // Use Redis for Drupal locks (semaphore).
  $conf['lock_inc'] = 'sites/all/modules/contrib/redis/redis.lock.inc';

  /**
  * Set some configuration settings for DEV, TEST, and LIVE
  */
  // Cached page compression - always off.
  $conf['page_compression'] = 0;
  // Minimum cache lifetime - always none.
  $conf['cache_lifetime'] = 0;

  // Drupal caching in TEST and LIVE should mostly line up
  if (in_array(PANTHEON_ENVIRONMENT, array('test', 'live'))) {
    // Anonymous caching
    $conf['cache'] = 1;
  }
  // Some settings in TEST and DEV should be the same
  if (in_array(PANTHEON_ENVIRONMENT, array('test', 'dev'))) {
    // rules or system messages can email users during testing unless we say no
    $conf['reroute_email_enable'] = 1;
    // Expiration of cached pages - none.
    $conf['page_cache_maximum_age'] = 0;
  }
  if (PANTHEON_ENVIRONMENT == 'live') {
    // Expiration of cached pages - 1 minute.
    $conf['page_cache_maximum_age'] = 60; //900
    $conf['preprocess_css'] = 1;
    $conf['preprocess_js'] = 1;
    // $conf['css_gzip_compression'] = TRUE;
    // $conf['js_gzip_compression'] = TRUE;
  }
  if (PANTHEON_ENVIRONMENT == 'test') {
  }
  if (PANTHEON_ENVIRONMENT == 'dev') {
    // Disable caches for easier debugging
    $conf['cache'] = 0;
    $conf['preprocess_css'] = 0;
    $conf['preprocess_js'] = 0;
    $conf['page_cache_maximum_age'] = 0;
 
    // Have PHP complain about absolutely everything.
    $conf['error_level'] = 2;  // Show all messages on your screen
    ini_set('display_errors', TRUE);  // These lines give you content on WSOD pages.
    ini_set('display_startup_errors', TRUE);
  }
}
/* perform 301 redirects */
// // print_r($_SERVER);
// if($_SERVER['REQUEST_URI'] == '/path/one') {
//   header('HTTP/1.0 301 Moved Permanently');
//   header('Location: /path/two');
//   exit();
// }
//

/**
 * Terminatur
 *
 * These local settings were generated by terminatur.
 * You may see them if you use Kalastack, Kalabox, Proviso or other local dev
 * tools.
 *
 */
if (isset($_SERVER['KALABOX']) &&  $_SERVER['KALABOX'] === 'on') {
  // DB Array and some common conf.
  $databases['default']['default'] = array(
    'driver' => 'mysql',
    'database' => 'mysite_kala',
    'username' => 'root',
    'password' => 'password',
    'host' => 'localhost',
    'port' => '3306',
    'prefix' => '',
  );
  // Set some common desirable local vars.
  $conf['file_temporary_path'] = '/tmp';
  $conf['file_public_path'] = 'sites/default/files';
  $conf['file_private_path'] = 'sites/default/files/private';
  $conf['reroute_email_enable'] = 1;

  $conf['cache'] = 0;
  $conf['css_gzip_compression'] = FALSE;
  $conf['js_gzip_compression'] = FALSE;
  $conf['preprocess_css'] = 0;
  $conf['preprocess_js'] = 0;
  $conf['site_name'] = 'mysite Local';
  $conf['cron_last'] = '9999999999';
}

 

Here is an example of D6 settings (note Habitat isnt available for D6, but you can do module disable/enable through the settings.php:

if (defined('PANTHEON_ENVIRONMENT')) {
  if (PANTHEON_ENVIRONMENT == 'dev') {
    $conf = array(
      'securepages_enable' => FALSE,
      'securesite_enabled' => '0',
      'preprocess_css' => FALSE,
      'preprocess_js' => FALSE,
      'reroute_email_enable' => 1,
      'fetcher_environment' => 'dev',
    );
  }
  if (PANTHEON_ENVIRONMENT == 'test') {
    $conf = array(
      'securepages_enable' => FALSE,
      'securesite_enabled' => '0',
      'preprocess_css' => FALSE,
      'preprocess_js' => FALSE,
      'reroute_email_enable' => 1,
      'fetcher_environment' => 'test',
    );
  }
  if (PANTHEON_ENVIRONMENT == 'live') {
    $conf = array(
      'securepages_enable' => TRUE,
      'securesite_enabled' => '1',
      'preprocess_css' => TRUE,
      'preprocess_js' => TRUE,
      'fetcher_environment' => 'prod',
    );
  }
}

 


Resources