How to setup Concrete CMS behind CDN (Amazon CloudFront)
This is a community-contributed tutorial. This tutorial is over a year old and may not apply to your version of Concrete CMS.  
    
    
        Jul 16, 2016    
            
    
    
            
        
    
Issues
The main issue of using Concrete CMS behind CDN is host names.
- www.example.com
- CDN (Amazon CloudFront)
 - When guest users access to your site, visit to this host.
 
 - origin.example.com
- Origin Web server (concrete5)
 - When you login to concrete5, access to this host. |
 
 
When this case, concrete5's canonical URL is origin.example.com, but actual host name for gust users is www.example.com .
The sub issue is cache life time.
CDN stores cache only when the full page cache is enabled, because of Cache-Control header. However, full page cache should be disabled when editing content with concrete because of host name.
How can we solve the issues?
- When editing content on origin.example.com, turn off caching.
 - When viewing content on www.example.com, turn on caching and set www.example.com to canonical URL.
 
Code
1. Change environment to cdn when HTTP User Agent is 'Amazon CloudFront'.
application/bootstrap/start.php
<?php
use Concrete\Core\Application\Application;
/**
 * -----------------------------------------------------------------
 * Instantiate concrete5
 * -----------------------------------------------------------------
 */
$app = new Application();
/**
 * -----------------------------------------------------------------
 * Detect the environment based on the use agent
 * -----------------------------------------------------------------
 */
$app->detectEnvironment(function(){
    $request = \Concrete\Core\Http\Request::getInstance();
    if ($request->server->get('HTTP_USER_AGENT') == 'Amazon CloudFront') {
        return 'cdn';
    }
});
return $app;
2. Turn off caching on default environment
application/config/concrete.php
<?php
return array(
    'cache' => array(
        'blocks' => false, // turn off block cache
        'pages' => 0, // turn off page cache
    ),
);
3. Turn on caching on cdn environment, and set canonical URLs
application/config/cdn.concrete.php
<?php
return array(
    'cache' => array(
        'blocks' => true, // turn on block cache
        'pages' => 'blocks', // cache page if all blocks support it.
    ),
    'seo' => array(
        'canonical_url' => 'http://www.example.com/',
        'canonical_ssl_url' => 'https://www.example.com/',
    ),
);