Note
Apache is the most commonly used web server for implementing Drupal. This section includes several references to the way things work with Drupal running on an Apache web server and Apache-specific configuration files. However, the same principles apply to all web servers on which Acquia Drupal is supported, differing only in their specific implementations.
Drupal page requests¶
Drupal processes most content requests by passing them to the script located at index.php
. It sends a query in the request to the server in the form of ?q=[something]
. In most cases, the [something]
is either a piece of content, such as node/345
, or a request for an administrative page, such as admin/build/modules
. The following list shows information requested from Drupal and the request sent to the web server:
Desired from Drupal | Requested from the web server |
---|
node/312 | index.php?q=node/312 |
admin | index.php?q=admin |
user/1 | index.php?q=user/1 |
Drupal's Clean URLs feature¶
Early search engines gave lower search rankings to sites that used the ?q=
or similar style URLs, considering dynamically generated content to be inferior to static pages. Although the major search engines aren't as picky as they once were, http://example.com/about-us
is easier for users to read and remember than http://example.com/index.php?q=about-us
or similar.
Full documentation on clean URLs in Drupal is available at Step 6: Configure clean URLs on drupal.org.
Note
Drupal 8 includes Clean URLs by default.
If available, Drupal uses the Apache mod_rewrite
module to handle requests and convert them from node/312
style requests to index.php?q=node/312
. During installation, Drupal runs a test to see if your server is configured to use mod_rewrite
and the .htaccess
file. If all is well, the installer activates Drupal's Clean URLs feature.
.htaccess file¶
By default, Drupal's Clean URLs are driven by a file named .htaccess
, which is a file that contains a set of rules that tell Apache how to handle requests. The important lines for Clean URLs are near the end of the file:
Drupal 7 and Drupal 8¶
# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]
Drupal 6¶
# Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Thee three RewiteCond
lines tell the Apache web server that if a request comes in for a file or a directory that doesn't exist in the filesystem, the server should take whatever was requested and put it after the index.php?q=
request that is passed to Drupal. This is handled entirely inside the web server, and website visitors never see the index.php?q=
version of the request.