12 private static $error =
null;
13 private static $errorMessage =
null;
21 require_once(__DIR__.
"/helper.php");
23 self::setErrorHandler();
24 self::registerAutoloader();
26 self::modifyHttpHeaders();
28 if (self::isValidRequest())
30 if (!Helper::isCompositeRequest())
32 self::trySendResponse();
35 define(
"USE_HTML_STATIC_CACHE",
true);
38 self::unregisterAutoloader();
39 self::restoreErrorHandler();
42 private static function isValidRequest()
46 isset($_GET[
"bxajaxid"]) ||
47 (isset(
$_SERVER[
"HTTP_X_REQUESTED_WITH"]) &&
$_SERVER[
"HTTP_X_REQUESTED_WITH"] ===
"XMLHttpRequest")
50 self::$error = Logger::TYPE_AJAX_REQUEST;
54 if (isset($_GET[
"ncc"]))
56 self::$error = Logger::TYPE_NCC_PARAMETER;
60 if (Helper::isBitrixFolder())
62 self::$error = Logger::TYPE_BITRIX_FOLDER;
66 if (preg_match(
"#^/index_controller\\.php#",
$_SERVER[
"REQUEST_URI"]) > 0)
68 self::$error = Logger::TYPE_CONTROLLER_FILE;
73 define(
"ENABLE_HTML_STATIC_CACHE_JS",
true);
75 if (
$_SERVER[
"REQUEST_METHOD"] !==
"GET")
77 self::$error = Logger::TYPE_GET_METHOD_ONLY;
78 self::$errorMessage =
"Request Method: ".$_SERVER[
"REQUEST_METHOD"];
82 if (isset($_GET[
"sessid"]))
84 self::$error = Logger::TYPE_SESSID_PARAMETER;
88 $compositeOptions = Helper::getOptions();
91 if (isset($compositeOptions[
"COOKIE_NCC"]) &&
92 array_key_exists($compositeOptions[
"COOKIE_NCC"], $_COOKIE) &&
93 $_COOKIE[$compositeOptions[
"COOKIE_NCC"]] ===
"Y"
96 self::$error = Logger::TYPE_NCC_COOKIE;
102 isset($compositeOptions[
"STORE_PASSWORD"]) &&
103 $compositeOptions[
"STORE_PASSWORD"] ==
"Y" &&
104 isset($_COOKIE[$compositeOptions[
"COOKIE_LOGIN"]]) &&
105 $_COOKIE[$compositeOptions[
"COOKIE_LOGIN"]] !==
"" &&
106 isset($_COOKIE[$compositeOptions[
"COOKIE_PASS"]]) &&
107 $_COOKIE[$compositeOptions[
"COOKIE_PASS"]] !==
""
111 !isset($compositeOptions[
"COOKIE_CC"]) ||
112 !array_key_exists($compositeOptions[
"COOKIE_CC"], $_COOKIE) ||
113 $_COOKIE[$compositeOptions[
"COOKIE_CC"]] !==
"Y"
116 self::$error = Logger::TYPE_CC_COOKIE_NOT_FOUND;
121 $queryPos = mb_strpos(
$_SERVER[
"REQUEST_URI"],
"?");
125 if (isset($compositeOptions[
"~EXCLUDE_MASK"]) && is_array($compositeOptions[
"~EXCLUDE_MASK"]))
127 foreach ($compositeOptions[
"~EXCLUDE_MASK"] as $mask)
131 self::$error = Logger::TYPE_EXCLUDE_MASK;
132 self::$errorMessage =
"Mask: ".$mask;
139 if (isset($compositeOptions[
"~EXCLUDE_PARAMS"]) && is_array($compositeOptions[
"~EXCLUDE_PARAMS"]))
141 foreach ($compositeOptions[
"~EXCLUDE_PARAMS"] as $param)
143 if (array_key_exists($param, $_GET))
145 self::$error = Logger::TYPE_EXCLUDE_PARAMETER;
146 self::$errorMessage =
"Parameter: ".$param;
153 $isRequestInMask =
false;
154 if (isset($compositeOptions[
"~INCLUDE_MASK"]) && is_array($compositeOptions[
"~INCLUDE_MASK"]))
156 foreach ($compositeOptions[
"~INCLUDE_MASK"] as $mask)
160 $isRequestInMask =
true;
166 if (!$isRequestInMask)
168 self::$error = Logger::TYPE_INCLUDE_MASK;
173 $host = Helper::getHttpHost();
174 if (!in_array(
$host, Helper::getDomains()))
176 self::$error = Logger::TYPE_INVALID_HOST;
177 self::$errorMessage =
"Host: ".$host;
181 if (!self::isValidQueryString($compositeOptions))
183 self::$error = Logger::TYPE_INVALID_QUERY_STRING;
193 private static function trySendResponse()
195 $cacheKey = self::getCacheKey();
196 $cache = self::getHtmlCacheResponse($cacheKey);
197 if ($cache ===
null || !$cache->exists())
202 $compositeOptions = Helper::getOptions();
204 $etag = $cache->getEtag();
205 $lastModified = $cache->getLastModified();
208 if (array_key_exists(
"HTTP_IF_NONE_MATCH",
$_SERVER) &&
$_SERVER[
"HTTP_IF_NONE_MATCH"] === $etag)
210 self::setStatus(
"304 Not Modified");
211 self::setHeaders($etag,
false,
"304");
216 if ($lastModified !==
false)
219 isset(
$_SERVER[
"HTTP_IF_MODIFIED_SINCE"]) ?
220 strtotime(
$_SERVER[
"HTTP_IF_MODIFIED_SINCE"]) :
223 if ($sinceModified && $sinceModified >= $lastModified)
225 self::setStatus(
"304 Not Modified");
226 self::setHeaders($etag,
false,
"304");
234 self::setHeaders($etag, $lastModified,
"200", $cache->getContentType());
238 if ($compositeOptions[
"COMPRESS"] && isset(
$_SERVER[
"HTTP_ACCEPT_ENCODING"]))
240 if (str_contains(
$_SERVER[
"HTTP_ACCEPT_ENCODING"],
"x-gzip"))
242 $compress =
"x-gzip";
252 header(
"Content-Encoding: ".$compress);
257 if ($cache->isGzipped())
262 header(
"Content-Length: " . strlen(
$contents));
270 private static function modifyHttpHeaders()
272 Helper::removeRandParam();
289 private static function setHeaders($etag, $lastModified, $compositeHeader =
false,
$contentType =
false)
293 header(
"ETag: ".$etag);
296 header(
"Expires: Fri, 07 Jun 1974 04:00:00 GMT");
298 if ($lastModified !==
false)
300 $utc = gmdate(
"D, d M Y H:i:s", $lastModified).
" GMT";
301 header(
"Last-Modified: ".$utc);
309 if ($compositeHeader !==
false)
311 header(
"X-Bitrix-Composite: Cache (".$compositeHeader.
")");
320 private static function setStatus(
$status)
322 $bCgi = (mb_stristr(php_sapi_name(),
"cgi") !==
false);
323 $bFastCgi = ($bCgi && (array_key_exists(
"FCGI_ROLE",
$_SERVER) || array_key_exists(
"FCGI_ROLE", $_ENV)));
324 if ($bCgi && !$bFastCgi)
334 private static function isValidQueryString($compositeOptions)
336 if (!isset($compositeOptions[
"INDEX_ONLY"]) || !$compositeOptions[
"INDEX_ONLY"])
342 if (isset(
$_SERVER[
"REQUEST_URI"]) && ($position = mb_strpos(
$_SERVER[
"REQUEST_URI"],
"?")) !==
false)
344 $queryString = mb_substr(
$_SERVER[
"REQUEST_URI"], $position + 1);
345 $queryString = Helper::removeIgnoredParams($queryString);
348 if ($queryString ===
"")
353 $queryParams =
array();
354 parse_str($queryString, $queryParams);
355 if (isset($compositeOptions[
"~GET"]) &&
356 !empty($compositeOptions[
"~GET"]) &&
357 empty(array_diff(array_keys($queryParams), $compositeOptions[
"~GET"]))
371 private static function getCacheKey()
373 $userPrivateKey = Helper::getUserPrivateKey();
375 return Helper::convertUriToPath(
376 Helper::getRequestUri(),
377 Helper::getHttpHost(),
378 Helper::getRealPrivateKey($userPrivateKey)
389 private static function getHtmlCacheResponse($cacheKey)
391 $configuration =
array();
392 $compositeOptions = Helper::getOptions();
393 $storage = $compositeOptions[
"STORAGE"] ??
false;
394 if (in_array(
$storage,
array(
"memcached",
"memcached_cluster")))
396 if (extension_loaded(
"memcache"))
398 return new MemcachedResponse($cacheKey, $configuration, $compositeOptions);
407 return new FileResponse($cacheKey, $configuration, $compositeOptions);
411 private static function registerAutoloader()
413 \spl_autoload_register(
array(__CLASS__,
"autoLoad"),
true);
416 private static function unregisterAutoloader()
418 \spl_autoload_unregister(
array(__CLASS__,
"autoLoad"));
423 $className = ltrim($className,
"\\");
424 if ($className ===
"Bitrix\\Main\\Composite\\Debug\\Logger")
426 require_once(__DIR__.
"/debug/logger.php");
447 return self::$errorMessage;
450 private static function setErrorHandler()
452 set_error_handler(
array(__CLASS__,
"handleError"));
455 private static function restoreErrorHandler()
457 restore_error_handler();
__construct($cacheKey, array $configuration, array $htmlCacheOptions)
__construct($cacheKey, array $configuration, array $htmlCacheOptions)
static getConnection(array $configuration, array $htmlCacheOptions)
__construct($cacheKey, array $configuration, array $htmlCacheOptions)
static handleError($code, $message, $file, $line)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)