mirror of https://github.com/avecms/AVE.cms.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
7.0 KiB
201 lines
7.0 KiB
<?php |
|
// включить/выключить кэширование |
|
$cache = true; |
|
|
|
// уровень вложенности текущей директории относительно корня |
|
// для определения правильного пути к папке кэша |
|
// (например, если combine.php лежит в корне, пишем 0). |
|
// можно передать через адр. строку: level=(int) |
|
$level = 0; |
|
|
|
// имя папки кэша относительно корня |
|
$cachedir = '/cache/combine'; |
|
|
|
############################################################### |
|
|
|
|
|
// определяем путь до папки кэша |
|
if ($cache) |
|
{ |
|
$level = ($_GET['level']) ? $_GET['level'] : $level; |
|
$cachedir = trim($cachedir,'/'); |
|
for ($i=0; $i<$level; $i++) |
|
{ |
|
$cachedir = '../' . $cachedir; |
|
} |
|
$cachedir = str_replace("\\", "/", dirname(__FILE__)) . '/' . $cachedir; |
|
if(!is_dir($cachedir)) |
|
{ |
|
header ("HTTP/1.0 503 Not Implemented"); |
|
exit("/* |
|
combine.php: Error! |
|
Неверно указан путь к папке кэша. Проверьте уровень вложенности. |
|
*/"); |
|
} |
|
} |
|
|
|
// Определяем тип файлов, полный путь к файлам и получаем список имен файлов |
|
if (!empty($_GET['css'])) |
|
{ |
|
$type = 'css'; |
|
$hash = md5($_GET['css']); |
|
$elements = explode(',', $_GET['css']); |
|
} |
|
elseif (!empty($_GET['js'])) |
|
{ |
|
$type = 'javascript'; |
|
$hash = md5($_GET['js']); |
|
$elements = explode(',', $_GET['js']); |
|
} |
|
else |
|
{ |
|
@header ("HTTP/1.0 503 Not Implemented"); |
|
exit; |
|
} |
|
$base = realpath(dirname(__FILE__)); |
|
|
|
// Determine last modification date of the files |
|
$lastmodified = 0; |
|
while (list(,$element) = each($elements)) { |
|
$path = realpath($base . '/' . $element); |
|
|
|
if (($type == 'javascript' && substr($path, -3) != '.js') || |
|
($type == 'css' && substr($path, -4) != '.css')) { |
|
@header ("HTTP/1.0 403 Forbidden"); |
|
exit; |
|
} |
|
|
|
if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) { |
|
@header ("HTTP/1.0 404 Not Found"); |
|
exit; |
|
} |
|
|
|
$lastmodified = max($lastmodified, filemtime($path)); |
|
} |
|
|
|
// Send Etag hash |
|
@$hash = $lastmodified . '-' . md5($_GET['files']); |
|
@header ("Etag: \"" . $hash . "\""); |
|
|
|
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && |
|
stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') |
|
{ |
|
// Return visit and no modifications, so do not send anything |
|
@header ("HTTP/1.0 304 Not Modified"); |
|
@header ('Content-Length: 0'); |
|
} |
|
else |
|
{ |
|
// First time visit or files were modified |
|
if ($cache) |
|
{ |
|
// Determine supported compression method |
|
$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'); |
|
$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate'); |
|
|
|
// Determine used compression method |
|
$encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none'); |
|
|
|
// Check for buggy versions of Internet Explorer |
|
if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && |
|
preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) { |
|
$version = floatval($matches[1]); |
|
|
|
if ($version < 6) |
|
$encoding = 'none'; |
|
|
|
if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) |
|
$encoding = 'none'; |
|
} |
|
|
|
// Try the cache first to see if the combined files were already generated |
|
$cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : ''); |
|
|
|
if (file_exists($cachedir . '/' . $cachefile)) { |
|
if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) { |
|
|
|
if ($encoding != 'none') { |
|
@header ("Content-Encoding: " . $encoding); |
|
} |
|
|
|
@header ("Content-Type: text/" . $type); |
|
@header ("Content-Length: " . filesize($cachedir . '/' . $cachefile)); |
|
|
|
fpassthru($fp); |
|
fclose($fp); |
|
exit; |
|
} |
|
} |
|
} |
|
|
|
// Get contents of the files |
|
$contents = ''; |
|
reset($elements); |
|
while (list(,$element) = each($elements)) { |
|
$path = realpath($base . '/' . $element); |
|
$contents .= file_get_contents($path); |
|
} |
|
|
|
if ($type == 'javascript') |
|
{ |
|
for ($i = 1; $i < 10; $i++) |
|
{ |
|
$contents = str_replace("\n\n", "\n", $contents); //Удаляем переносы строк |
|
$contents = str_replace("\r\r", "\r", $contents); //Удаляем переносы строк |
|
$contents = str_replace("\r\n\r\n", "\r\n", $contents); //Удаляем переносы строк |
|
} |
|
} |
|
|
|
if ($type == 'css') |
|
{ |
|
$contents = preg_replace('/\/\*.*\*\//Uis', '', $contents); //Удаляем комментарии |
|
$contents = str_replace("\r", "", $contents); //Удаляем переносы строк |
|
$contents = str_replace("\n", "", $contents); //Удаляем переносы строк |
|
$contents = str_replace(chr(9), "", $contents); //Удаляем табуляцию |
|
$contents = str_replace(" }", "}", $contents); //Удаляем пробелы перед } |
|
$contents = str_replace(" {", "{", $contents); //Удаляем пробелы перед { |
|
$contents = str_replace("{ ", "{", $contents); //Удаляем пробелы после { |
|
$contents = str_replace("} ", "}", $contents); //Удаляем пробелы после } |
|
$contents = str_replace("; ", ";", $contents); //Удаляем пробелы после ; |
|
$contents = str_replace(" ;", ";", $contents); //Удаляем пробелы перед ; |
|
$contents = str_replace(" :", ":", $contents); //Удаляем пробелы перед : |
|
$contents = str_replace(": ", ":", $contents); //Удаляем пробелы после : |
|
$contents = str_replace("+ ", "+", $contents); //Удаляем пробелы после + |
|
$contents = str_replace(" +", "+", $contents); //Удаляем пробелы перед + |
|
$contents = str_replace("= ", "=", $contents); //Удаляем пробелы после = |
|
$contents = str_replace(" =", "=", $contents); //Удаляем пробелы перед = |
|
$contents = str_replace("- ", "-", $contents); //Удаляем пробелы после - |
|
$contents = str_replace("/ ", "/", $contents); //Удаляем пробелы после / |
|
$contents = str_replace(" /", "/", $contents); //Удаляем пробелы перед / |
|
$contents = str_replace(", ", ",", $contents); //Удаляем пробелы после , |
|
$contents = str_replace(" ,", ",", $contents); //Удаляем пробелы перед , |
|
$contents = str_replace(" ", " ", $contents); //Удаляем двойной пробел |
|
} |
|
|
|
// Send Content-Type |
|
@header ("Content-Type: text/" . $type); |
|
|
|
if (isset($encoding) && $encoding != 'none') |
|
{ |
|
// Send compressed contents |
|
$contents = gzencode($contents, 3, $gzip ? FORCE_GZIP : FORCE_DEFLATE); |
|
@header ("Content-Encoding: " . $encoding); |
|
@header ('Content-Length: ' . strlen($contents)); |
|
echo $contents; |
|
} |
|
else |
|
{ |
|
// Send regular contents |
|
@header ('Content-Length: ' . strlen($contents)); |
|
echo $contents; |
|
} |
|
|
|
// Store cache |
|
if ($cache) { |
|
if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) { |
|
fwrite($fp, $contents); |
|
fclose($fp); |
|
} |
|
} |
|
} |
|
?>
|
|
|