How to move Drupal to a subdirectory and keep the links

2 min read >

How to move Drupal to a subdirectory and keep the links

Engineering Insights & Web Platforms

The usual way for Drupal is to have it live at the root of your website. It’s all nice if the only thing on your site is Drupal, but it gets very cluttered when you have other top-level directories.

One customer had his corporate site at, say, “www.example.com“, and his customer support pages at “www.example.com/support“.  We wanted to keep the application in the “support” directory, and move all the drupal directories under “corporate“. And keep the old links working.

First, we had to let Drupal know that, even if it’s been relocated to “corporate”, the URL still remains the same. Do it in “corporate/sites/default/settings.php“:

$base_url = 'http://www.example.com';

Then tell Apache that Drupal has moved. Put these rewrite rules in .htaccess at the root of your website.

  RewriteEngine on
 
  # Rewrite www.example.com to the Drupal home page: www.example.com/corporate/index.php
  RewriteRule ^$ corporate/index.php [L]
  # Let Drupal process paths like www.example.com/corporate/about
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^corporate/(.*)$ corporate/index.php?q=$1 [L,QSA]

  # Search for real Drupal files that moved, 
  #  (e.g. www.example.com/flash/intro.swf to www.example.com/corporate/flash/intro.swf)
  RewriteCond %{DOCUMENT_ROOT}/corporate/$1 -f
  RewriteRule ^(.*)$ corporate/$1 [L]

  # Let Drupal process all paths that are not real files and directories, like www.example.com/about
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ corporate/index.php?q=$1 [L,QSA]

  # What's left are real non-Drupal pages and directories, like www.example.com/support