Ejemplo n.º 1
0
	/**
	 * @return void
	 */
	public static function startCaching()
	{
		$HTML_PAGES_ROOT = $_SERVER["DOCUMENT_ROOT"].FX_PERSONAL_ROOT."/html_pages";

		if(
			isset($_SERVER["HTTP_FX_AJAX"])
			|| (isset($_SERVER["HTTP_FORWARDED"]) && $_SERVER["HTTP_FORWARDED"]=="SSL")
			|| (strncmp($_SERVER["REQUEST_URI"], FX_ROOT, strlen(FX_ROOT)) == 0)
			|| (strncmp($_SERVER["REQUEST_URI"], FX_PERSONAL_ROOT, strlen(FX_ROOT)) == 0)
			|| (preg_match("#^/index_controller\\.php#", $_SERVER["REQUEST_URI"]) > 0)
		)
		{
			return;
		}

		$arHTMLPagesOptions = array();
		if (file_exists($HTML_PAGES_ROOT."/.config.php"))
			include($HTML_PAGES_ROOT."/.config.php");

		$useCompositeCache = isset($arHTMLPagesOptions["COMPOSITE"]) && $arHTMLPagesOptions["COMPOSITE"] === "Y";
		if ($useCompositeCache)
		{
			//to warm up localStorage
			define("ENABLE_HTML_STATIC_CACHE_JS", true);
		}

		if(
			$_SERVER["REQUEST_METHOD"] !== "GET"
			|| isset($_GET["sessid"])
		)
		{
			return;
		}

		if ($useCompositeCache)
		{
			if (isset($_SERVER["HTTP_FX_REF"]))
			{
				$_SERVER["HTTP_REFERER"] = $_SERVER["HTTP_FX_REF"];
			}

			if (array_key_exists("bxrand", $_GET))
			{
				unset($_GET["bxrand"]);
				unset($_REQUEST["bxrand"]);
				if (isset($_SERVER["REQUEST_URI"]))
				{
					$_SERVER["REQUEST_URI"] = preg_replace("/([?&]bxrand=[0-9]+)\$/", "", $_SERVER["REQUEST_URI"]);
				}
				if (isset($_SERVER["QUERY_STRING"]))
				{
					$_SERVER["QUERY_STRING"] = preg_replace("/([?&]bxrand=[0-9]+)\$/", "", $_SERVER["QUERY_STRING"]);
				}
			}
		}

		if(
			$useCompositeCache
			&& (
				isset($arHTMLPagesOptions["COOKIE_NCC"])
				&& array_key_exists($arHTMLPagesOptions["COOKIE_NCC"], $_COOKIE)
				&& $_COOKIE[$arHTMLPagesOptions["COOKIE_NCC"]] === "Y"
			)
		)
		{
			return;
		}

		if(
			!$useCompositeCache
			&& (
				array_key_exists(session_name(), $_COOKIE)
				|| array_key_exists(session_name(), $_REQUEST)
			)
		)
		{
			return;
		}

		//Check for stored authorization
		if(
			isset($arHTMLPagesOptions["STORE_PASSWORD"]) && $arHTMLPagesOptions["STORE_PASSWORD"] == "Y"
			&& isset($_COOKIE[$arHTMLPagesOptions["COOKIE_LOGIN"]]) && $_COOKIE[$arHTMLPagesOptions["COOKIE_LOGIN"]] <> ''
			&& isset($_COOKIE[$arHTMLPagesOptions["COOKIE_PASS"]]) && $_COOKIE[$arHTMLPagesOptions["COOKIE_PASS"]] <> ''
		)
		{
			if (
				!$useCompositeCache
				|| !isset($arHTMLPagesOptions["COOKIE_CC"])
				|| !array_key_exists($arHTMLPagesOptions["COOKIE_CC"], $_COOKIE)
				|| $_COOKIE[$arHTMLPagesOptions["COOKIE_CC"]] !== "Y"
			)
			{
				return;
			}
		}

		//Check for masks
		$p = strpos($_SERVER["REQUEST_URI"], "?");
		if($p === false)
			$PAGES_FILE = $_SERVER["REQUEST_URI"];
		else
			$PAGES_FILE = substr($_SERVER["REQUEST_URI"], 0, $p);

		if(is_array($arHTMLPagesOptions["~EXCLUDE_MASK"]))
		{
			foreach($arHTMLPagesOptions["~EXCLUDE_MASK"] as $mask)
			{
				if(preg_match($mask, $PAGES_FILE) > 0)
				{
					return;
				}
			}
		}

		if(is_array($arHTMLPagesOptions["~INCLUDE_MASK"]))
		{
			foreach($arHTMLPagesOptions["~INCLUDE_MASK"] as $mask)
			{
				if(preg_match($mask, $PAGES_FILE) > 0)
				{
					$PAGES_FILE = "*";
					break;
				}
			}
		}

		if($PAGES_FILE !== "*")
			return;

		if ($useCompositeCache)
		{
			if(
				isset($arHTMLPagesOptions["DOMAINS"])
				&& !in_array($_SERVER["HTTP_HOST"], $arHTMLPagesOptions["DOMAINS"])
			)
			{
				return;
			}

			if(
				isset($arHTMLPagesOptions["INDEX_ONLY"])
				&& $arHTMLPagesOptions["INDEX_ONLY"]
				&& !preg_match("#^(/[^?]+)\\.php$#", $_SERVER["REQUEST_URI"])
				&& !preg_match("#^([^?]*)/$#", $_SERVER["REQUEST_URI"])
				&& ! (
					isset($arHTMLPagesOptions["~GET"])
					&& !empty($arHTMLPagesOptions["~GET"])
					&& isset($_GET)
					&& !empty($_GET)
					&& count(array_diff(array_keys($_GET), $arHTMLPagesOptions["~GET"])) === 0
				)
			)
			{
				return;
			}

			$HTML_PAGES_ROOT .= "/".preg_replace("/:(\\d+)\$/", "-\\1", $_SERVER["HTTP_HOST"]);
		}

		$arMatch = array();
		if(preg_match("#^(/.+?)\\.php\\?(.*)#", $_SERVER["REQUEST_URI"], $arMatch) > 0)
		{
			if(strpos($arMatch[2], "\\")!==false || strpos($arMatch[2], "/")!==false)
				return;
			$PAGES_FILE = $arMatch[1]."@".$arMatch[2];
		}
		elseif(preg_match("#^(/.+)\\.php$#", $_SERVER["REQUEST_URI"], $arMatch) > 0)
		{
			$PAGES_FILE = $arMatch[1]."@";
		}
		if(preg_match("#^(.*?)/\\?(.*)#", $_SERVER["REQUEST_URI"], $arMatch) > 0)
		{
			if(strpos($arMatch[2], "\\")!==false || strpos($arMatch[2], "/")!==false)
				return;
			if(strlen($arMatch[1]) && substr($arMatch[1], 0, 1)!=="/")
				return;
			$PAGES_FILE = $arMatch[1]."/index@".$arMatch[2];
		}
		elseif(preg_match("#^(.*)/$#", $_SERVER["REQUEST_URI"], $arMatch) > 0)
		{
			if(strlen($arMatch[1]) && substr($arMatch[1], 0, 1)!=="/")
				return;
			$PAGES_FILE = $arMatch[1]."/index@";
		}

		$PAGES_FILE = $HTML_PAGES_ROOT.str_replace(".", "_", $PAGES_FILE).".html";

		//This checks for invalid symbols
		//TODO: make it Windows compatible
		if(preg_match("/(\\?|\\*|\\.\\.)/", $PAGES_FILE) > 0)
			return;

		if(
			(isset($_SERVER["HTTP_FX_CACHE_MODE"]) && $_SERVER["HTTP_FX_CACHE_MODE"] === "HTMLCACHE")
			|| (defined("CACHE_MODE") && constant("CACHE_MODE") === "HTMLCACHE")
		)
		{
			define("USE_HTML_STATIC_CACHE", true);
			return;
		}

		if(file_exists($PAGES_FILE))
		{
			//Update statistic
			CHTMLPagesCache::writeStatistic(1);

			$mtime = filemtime($PAGES_FILE);
			$fsize = filesize($PAGES_FILE);

			//Handle ETag
			$ETag = md5($PAGES_FILE.$fsize.$mtime);
			if(array_key_exists("HTTP_IF_NONE_MATCH", $_SERVER) && ($_SERVER['HTTP_IF_NONE_MATCH'] === $ETag))
			{
				CHTMLPagesCache::SetStatus("304 Not Modified");
				die();
			}
			header("ETag: ".$ETag);

			//Handle Last Modified
			$lastModified = gmdate('D, d M Y H:i:s', $mtime).' GMT';
			if(array_key_exists("HTTP_IF_MODIFIED_SINCE", $_SERVER) && ($_SERVER['HTTP_IF_MODIFIED_SINCE'] === $lastModified))
			{
				CHTMLPagesCache::SetStatus("304 Not Modified");
				die();
			}
			header("Expires: Fri, 7 Jun 1974 04:00:00 GMT");
			header('Last-Modified: '.$lastModified);

			$fp = fopen($PAGES_FILE, "rb");
			if($fp !== false)
			{
				$contents = fread($fp, $fsize);
				fclose($fp);

				//Try to parse charset encoding
				$head_end = strpos($contents, "</head>");
				if($head_end !== false)
				{
					if(preg_match("#<meta\\s+http-equiv\\s*=\\s*(['\"])Content-Type(\\1)\\s+content\\s*=\\s*(['\"])(.*?)(\\3)#im", substr($contents, 0, $head_end), $arMatch))
					{
						header("Content-type: ".$arMatch[4]);
					}
				}

				//compression support
				$compress = "";
				if($arHTMLPagesOptions["COMPRESS"])
				{
					if(isset($_SERVER["HTTP_ACCEPT_ENCODING"]))
					{
						if(strpos($_SERVER["HTTP_ACCEPT_ENCODING"],'x-gzip') !== false)
							$compress = "x-gzip";
						elseif(strpos($_SERVER["HTTP_ACCEPT_ENCODING"],'gzip') !== false)
							$compress = "gzip";
					}
				}

				if($compress)
				{
					if(isset($_SERVER["HTTP_USER_AGENT"]))
					{
						$USER_AGENT = $_SERVER["HTTP_USER_AGENT"];
						if((strpos($USER_AGENT, "MSIE 5")>0 || strpos($USER_AGENT, "MSIE 6.0")>0) && strpos($USER_AGENT, "Opera")===false)
							$contents = str_repeat(" ", 2048)."\r\n".$contents;
					}
					$Size = function_exists("mb_strlen")? mb_strlen($contents, 'latin1'): strlen($contents);
					$Crc = crc32($contents);
					$contents = gzcompress($contents, 4);
					$contents = function_exists("mb_substr")? mb_substr($contents, 0, -4, 'latin1'): substr($contents, 0, -4);

					header("Content-Encoding: $compress");
					echo "\x1f\x8b\x08\x00\x00\x00\x00\x00",$contents,pack('V',$Crc),pack('V',$Size);
				}
				else
				{
					header("Content-Length: ".filesize($PAGES_FILE));
					echo $contents;
				}
				die();
			}
		}
		else//if(file_exists($PAGES_FILE))
		{
			if ($useCompositeCache)
			{
				if (isset($arHTMLPagesOptions["~FILE_QUOTA"]))
				{
					$cache_quota = doubleval($arHTMLPagesOptions["~FILE_QUOTA"]);
					$arStat = CHTMLPagesCache::readStatistic();
					if($arStat)
						$cached_size = $arStat["FILE_SIZE"];
					else
						$cached_size = 0.0;
					if ($cached_size > $cache_quota)
					{
						CHTMLPagesCache::writeStatistic(0, 0, 1);
						return;
					}
				}

				if (!defined('USE_HTML_STATIC_CACHE'))
					define('USE_HTML_STATIC_CACHE', true);
			}
			else
			{
				define('HTML_PAGES_FILE', $PAGES_FILE);
			}
		}
	}
Ejemplo n.º 2
0
 function startCaching()
 {
     $HTML_PAGES_ROOT = $_SERVER["DOCUMENT_ROOT"] . BX_PERSONAL_ROOT . "/html_pages";
     if ($_SERVER["REQUEST_METHOD"] === "POST" || array_key_exists(session_name(), $_COOKIE) || array_key_exists(session_name(), $_REQUEST) || strncmp($_SERVER["REQUEST_URI"], BX_ROOT, strlen(BX_ROOT)) == 0 || strncmp($_SERVER["REQUEST_URI"], BX_PERSONAL_ROOT, strlen(BX_ROOT)) == 0 || preg_match("#^/index_controller\\.php#", $_SERVER["REQUEST_URI"]) > 0) {
         return;
     }
     $arHTMLPagesOptions = array();
     if (file_exists($HTML_PAGES_ROOT . "/.config.php")) {
         include $HTML_PAGES_ROOT . "/.config.php";
     }
     //Check for stored authorization
     if (isset($arHTMLPagesOptions["STORE_PASSWORD"]) && $arHTMLPagesOptions["STORE_PASSWORD"] == "Y" && isset($_COOKIE[$arHTMLPagesOptions["COOKIE_LOGIN"]]) && $_COOKIE[$arHTMLPagesOptions["COOKIE_LOGIN"]] != '' && isset($_COOKIE[$arHTMLPagesOptions["COOKIE_PASS"]]) && $_COOKIE[$arHTMLPagesOptions["COOKIE_PASS"]] != '') {
         return;
     }
     //Check for masks
     $p = strpos($_SERVER["REQUEST_URI"], "?");
     if ($p === false) {
         $PAGES_FILE = $_SERVER["REQUEST_URI"];
     } else {
         $PAGES_FILE = substr($_SERVER["REQUEST_URI"], 0, $p);
     }
     if (is_array($arHTMLPagesOptions["~EXCLUDE_MASK"])) {
         foreach ($arHTMLPagesOptions["~EXCLUDE_MASK"] as $mask) {
             if (preg_match($mask, $PAGES_FILE) > 0) {
                 return;
             }
         }
     }
     if (is_array($arHTMLPagesOptions["~INCLUDE_MASK"])) {
         foreach ($arHTMLPagesOptions["~INCLUDE_MASK"] as $mask) {
             if (preg_match($mask, $PAGES_FILE) > 0) {
                 $PAGES_FILE = "*";
                 break;
             }
         }
     }
     if ($PAGES_FILE !== "*") {
         return;
     }
     $arMatch = array();
     if (preg_match("#^(/.+?)\\.php\\?(.*)#", $_SERVER["REQUEST_URI"], $arMatch) > 0) {
         if (strpos($arMatch[2], "\\") !== false || strpos($arMatch[2], "/") !== false) {
             return;
         }
         $PAGES_FILE = $HTML_PAGES_ROOT . $arMatch[1] . "@" . $arMatch[2] . ".html";
     } elseif (preg_match("#^(/.+)\\.php\$#", $_SERVER["REQUEST_URI"], $arMatch) > 0) {
         $PAGES_FILE = $HTML_PAGES_ROOT . $arMatch[1] . "@.html";
     }
     if (preg_match("#^(.*?)/\\?(.*)#", $_SERVER["REQUEST_URI"], $arMatch) > 0) {
         if (strpos($arMatch[2], "\\") !== false || strpos($arMatch[2], "/") !== false) {
             return;
         }
         if (strlen($arMatch[1]) && substr($arMatch[1], 0, 1) !== "/") {
             return;
         }
         $PAGES_FILE = $HTML_PAGES_ROOT . $arMatch[1] . "/index@" . $arMatch[2] . ".html";
     } elseif (preg_match("#^(.*)/\$#", $_SERVER["REQUEST_URI"], $arMatch) > 0) {
         if (strlen($arMatch[1]) && substr($arMatch[1], 0, 1) !== "/") {
             return;
         }
         $PAGES_FILE = $HTML_PAGES_ROOT . $arMatch[1] . "/index@.html";
     }
     //This checks for invalid symbols
     //TODO: make it Windows compatible
     if (preg_match("/(\\?|\\*|\\.\\.)/", $PAGES_FILE) > 0) {
         return;
     }
     if (file_exists($PAGES_FILE)) {
         //Update statistic
         CHTMLPagesCache::writeStatistic(1);
         $mtime = filemtime($PAGES_FILE);
         $fsize = filesize($PAGES_FILE);
         //Handle ETag
         $ETag = md5($PAGES_FILE . $fsize . $mtime);
         if (array_key_exists("HTTP_IF_NONE_MATCH", $_SERVER) && $_SERVER['HTTP_IF_NONE_MATCH'] === $ETag) {
             CHTMLPagesCache::SetStatus("304 Not Modified");
             die;
         }
         header("ETag: " . $ETag);
         //Handle Last Modified
         $lastModified = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
         if (array_key_exists("HTTP_IF_MODIFIED_SINCE", $_SERVER) && $_SERVER['HTTP_IF_MODIFIED_SINCE'] === $lastModified) {
             CHTMLPagesCache::SetStatus("304 Not Modified");
             die;
         }
         header("Expires: Fri, 7 Jun 1974 04:00:00 GMT");
         header('Last-Modified: ' . $lastModified);
         $fp = fopen($PAGES_FILE, "rb");
         if ($fp !== false) {
             if (version_compare(phpversion(), "5.3.0", "<") && (($v = ini_get("magic_quotes_runtime")) == 1 || strtolower($v) == 'on')) {
                 set_magic_quotes_runtime(0);
             }
             $contents = fread($fp, $fsize);
             fclose($fp);
             //Try to parse charset encoding
             $head_end = strpos($contents, "</head>");
             if ($head_end !== false) {
                 if (preg_match("#<meta\\s+http-equiv\\s*=\\s*(['\"])Content-Type(\\1)\\s+content\\s*=\\s*(['\"])(.*?)(\\3)#im", substr($contents, 0, $head_end), $arMatch)) {
                     header("Content-type: " . $arMatch[4]);
                 }
             }
             //compression support
             $compress = "";
             if ($arHTMLPagesOptions["COMPRESS"]) {
                 if (isset($_SERVER["HTTP_ACCEPT_ENCODING"])) {
                     if (strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'x-gzip') !== false) {
                         $compress = "x-gzip";
                     } elseif (strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip') !== false) {
                         $compress = "gzip";
                     }
                 }
             }
             if ($compress) {
                 if (isset($_SERVER["HTTP_USER_AGENT"])) {
                     $USER_AGENT = $_SERVER["HTTP_USER_AGENT"];
                     if ((strpos($USER_AGENT, "MSIE 5") > 0 || strpos($USER_AGENT, "MSIE 6.0") > 0) && strpos($USER_AGENT, "Opera") === false) {
                         $contents = str_repeat(" ", 2048) . "\r\n" . $contents;
                     }
                 }
                 $Size = function_exists("mb_strlen") ? mb_strlen($contents, 'latin1') : strlen($contents);
                 $Crc = crc32($contents);
                 $contents = gzcompress($contents, 4);
                 $contents = function_exists("mb_substr") ? mb_substr($contents, 0, -4, 'latin1') : substr($contents, 0, -4);
                 header("Content-Encoding: {$compress}");
                 echo "‹", $contents, pack('V', $Crc), pack('V', $Size);
             } else {
                 header("Content-Length: " . filesize($PAGES_FILE));
                 echo $contents;
             }
             die;
         }
     } else {
         define('HTML_PAGES_FILE', $PAGES_FILE);
     }
 }