* FilesystemPublisher::$domain_based_caching = true; * * * and added main site host mapping in subsites/host-map.php after everytime * a new subsite is created or modified. * * If you are not using subsites, the host-map.php file will not exist (it is * automatically generated by the Subsites module) and the cache will default * to no subdirectory. * * @package staticpublisher */ require_once('../framework/core/Constants.php'); if(defined('SS_STATICPUBLISHER_ENABLED')) { $cacheEnabled = SS_STATICPUBLISHER_ENABLED; } else { $cacheEnabled = true; } if(defined('SS_STATICPUBLISHER_CACHEDIR')) { $cacheBaseDir = SS_STATICPUBLISHER_CACHEDIR; } else { $cacheBaseDir = '../cache/'; } if(defined('SS_STATICPUBLISHER_DEBUG')) { $cacheDebug = SS_STATICPUBLISHER_DEBUG; } else { $cacheDebug = false; } // Optional settings for FilesystemPublisher::$domain_based_mapping=TRUE $hostmapLocation = '../subsites/host-map.php'; // Specific to 'homepagefordomain' module $homepageMapLocation = '../assets/_homepage-map.php'; function skipCache() { require_once('../framework/core/Core.php'); require_once('../framework/main.php'); } if ( $cacheEnabled && empty($_COOKIE['bypassStaticCache']) // No GET params other than cache relevant config is passed (e.g. "?stage=Stage"), // which would mean that we have to bypass the cache && count(array_diff(array_keys($_GET), array('url', 'cacheSubdir'))) == 0 // Request is not POST (which would have to be handled dynamically) && count($_POST) == 0 && count($_GET) <= 1 ) { // Define system paths (copied from Core.php) if(!defined('BASE_PATH')) { // Assuming that this file is staticpublisher/main.php we can then determine the base path define('BASE_PATH', rtrim(dirname(dirname(__FILE__))), DIRECTORY_SEPARATOR); } if(!defined('BASE_URL')) { // Determine the base URL by comparing SCRIPT_NAME to SCRIPT_FILENAME and getting common elements $path = realpath($_SERVER['SCRIPT_FILENAME']); if(substr($path, 0, strlen(BASE_PATH)) == BASE_PATH) { $urlSegmentToRemove = substr($path, strlen(BASE_PATH)); if(substr($_SERVER['SCRIPT_NAME'], -strlen($urlSegmentToRemove)) == $urlSegmentToRemove) { $baseURL = substr($_SERVER['SCRIPT_NAME'], 0, -strlen($urlSegmentToRemove)); define('BASE_URL', rtrim($baseURL, DIRECTORY_SEPARATOR)); } } } $url = $_GET['url']; // Remove base folders from the URL if webroot is hosted in a subfolder if (substr(strtolower($url), 0, strlen(BASE_URL)) == strtolower(BASE_URL)) { $url = substr($url, strlen(BASE_URL)); } $host = str_replace('www.', '', $_SERVER['HTTP_HOST']); // Custom cache dir for debugging purposes if (isset($_GET['cacheSubdir']) && !preg_match('/[^a-zA-Z0-9\-_]/', $_GET['cacheSubdir'])) { $cacheDir = $_GET['cacheSubdir'].'/'; } // Custom mapping through PHP file (assumed FilesystemPublisher::$domain_based_mapping=TRUE) else if (file_exists($hostmapLocation)) { include_once $hostmapLocation; $subsiteHostmap['default'] = isset($subsiteHostmap['default']) ? $subsiteHostmap['default'] : ''; $cacheDir = (isset($subsiteHostmap[$host]) ? $subsiteHostmap[$host] : $subsiteHostmap['default']) . '/'; } // No subfolder (for FilesystemPublisher::$domain_based_mapping=FALSE) else { $cacheDir = ''; } // Look for the file in the cachedir $file = trim($url, '/'); $file = $file ? $file : 'index'; // Route to the 'correct' index file (if applicable) if ($file == 'index' && file_exists($homepageMapLocation)) { include_once $homepageMapLocation; $file = isset($homepageMap[$_SERVER['HTTP_HOST']]) ? $homepageMap[$_SERVER['HTTP_HOST']] : $file; } // Encode each part of the path individually, in order to support multibyte paths. // SiteTree.URLSegment and hence the static folder and filenames are stored in encoded form, // to avoid filesystem incompatibilities. $file = implode('/', array_map('rawurlencode', explode('/', $file))); // Find file by extension (either *.html or *.php) if (file_exists($cacheBaseDir . $cacheDir . $file . '.html')) { //source: http://css-tricks.com/snippets/php/intelligent-php-cache-control/ $filepath = $cacheBaseDir . $cacheDir . $file . '.html'; $lastModified=filemtime($filepath); $etagFile = md5_file($filepath); $ifModifiedSince=(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false); $etagHeader=(isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false); header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT"); header("Etag: $etagFile"); header('Cache-Control: public'); header('X-SilverStripe-Cache: hit at '.@date('r')); if (($ifModifiedSince && @strtotime($ifModifiedSince)==$lastModified) || $etagHeader == $etagFile) { header("HTTP/1.1 304 Not Modified"); exit; } echo file_get_contents($filepath); if ($cacheDebug) { echo "

File was cached

"; } } elseif (file_exists($cacheBaseDir . $cacheDir . $file . '.php')) { header('X-SilverStripe-Cache: hit at '.@date('r')); include_once $cacheBaseDir . $cacheDir . $file . '.php'; if ($cacheDebug) { echo "

File was cached

"; } } else { header('X-SilverStripe-Cache: miss at '.@date('r') . ' on ' . $cacheDir . $file); skipCache(); if ($cacheDebug) echo "

File was NOT cached

"; } } else { // Fall back to dynamic generation via normal routing if caching has been explicitly disabled header('X-SilverStripe-Cache: skipped at '.@date('r')); if ($cacheDebug) { echo "

Cache skipped

"; } skipCache(); }