This document contains information for an outdated version and may not be maintained any more. If some of your projects still use this version, consider upgrading as soon as possible.

Execution Pipeline


This page documents all the steps from an URL request to the delivered page.

.htaccess and RewriteRule

Silverstripe uses mod_rewrite to deal with page requests. So instead of having your normal everyday index.php file which tells all, you need to look elsewhere.

The basic .htaccess file after installing SilverStripe look like this:


<Files *.ss>
Order deny,allow
Deny from all
Allow from

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_URI} !(\.gif$)|(\.jpg$)|(\.png$)|(\.css$)|(\.js$)

RewriteCond %{REQUEST_URI} ^(.*)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* sapphire/main.php?url=%1&%{QUERY_STRING} [L]


The <Files> section denies direct access to the template files from anywhere but the server itself.

The next section enables the rewriting engine and rewrites requests to sapphire/main.php if they meet the following criteria:

  • URI doesn't end in .gif, .jpg, .png, .css, or .js
  • The requested file doesn't exist on the filesystem sapphire/main.php is called with the REQUEST_FILENAME (%1) as the url parameter and also appends the original QUERY_STRING.

See the mod_rewrite documentation for more information on how mod_rewrite works.


All requests go through main.php, which sets up the environment and then hands control over to Director.

See: The API documentation of Main for information about how main.php processes requests.

Director and URL patterns

main.php relies on Director to work out which controller should handle this request. Director will instantiate that controller object and then call Controller::run().

See: The API documentation of Director for information about how Director parses URLs and hands control over to a controller object.

In general, the URL is build up as follows: page/action/ID/otherID - e.g. This will add an object with ID 12 to the cart.

When you create a function, you can access the ID like this:

 function addToCart ($request) {
  $param = $r->allParams();
  echo "my ID = ".$param["ID"];
  $obj = DataObject::get("myProduct", $param["ID"]);

Controllers and actions

Controllers are the building blocks of your application.

See: The API documentation for Controller

You can access the following controller-method with /team/signup

class Team extends DataObject {}

class Team_Controller extends Controller {
  static $allowed_actions = array('signup');
  public function signup($id, $otherId) {
    return $this->renderWith('MyTemplate');

SSViewer template rendering

See templates for information on the SSViewer template system.

Was this article helpful?