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/',
),
);