На настоящий период SEO ранжирование страниц находится в зависимости от нескольких сотен показателей, но скорость загрузки вашего сайта для поисковиков — один из главных показателей. И не зря, ведь даже если у вас очень продвинутый сайт но среднее время загрузи 15 секунд то пользователь просто не станет дожидаться пока же раскроется страничка вашего вебсайта и пойдет дальше по выдаче. Как результат — утрата значительного процента возможных посетителей и значительное снижение поведенческих факторов. В этой статье мы расскажем вам о том как улучшить свои показатели в самом популярном сервисе по тестированию скорости сайта — Google Page Speed.
Самый простой инструмент оценки технической оптимизации проекта - Google PageSpeed Insights
В целом, для первичной оптимизации страницы необходимо выполнить 8 несложных пунктов:
AddType text/css cssgz AddType image/svg+xml svgz AddType text/javascript jsgz AddEncoding x-gzip .cssgz .jsgz .svgzЗдесь мы добавляем новый тип файлов. Теперь тип файлов с разрешением svgz будет обрабатываться как файл с типом данных text/css, jsgz - файл с типом данных text/javascript и т.д.
$data = $APPLICATION->EndBufferContentMan();Теперь в переменной $data содержится вся наша html-страница
$data = preg_replace(array('/\r+/', '/\t+/'), '', $data);
$DATA_DOM = mb_convert_encoding($data, 'HTML-ENTITIES', "UTF-8"); $dom = new DOMDocument; $dom->loadHTML($DATA_DOM);
foreach ($dom->getElementsByTagName("script") as $script){ $is_remove = true; if ($script->getAttribute('src')){ $src = $script->getAttribute('src'); if (strpos($src, ".jsgz") === false){ if (strpos($src, "http") === false || strpos($src, $domain) !== false){ $arUrl = explode("?", $src); $arPath = explode("/", $arUrl[0]); $arInfo = pathinfo($arUrl[0]); if ($arInfo["basename"]){ $arUrl[0] = str_replace($domain, "", $arUrl[0]); $content = file_get_contents($_SERVER["DOCUMENT_ROOT"].$arUrl[0]); $content .= ";"; $content = preg_replace('#/\*(?:[^*]*(?:\*(?!/))*)*\*/#', '', $content); $all .= "\n\n" . $content; } } else { $arUrl = explode("?", $src); $arPath = explode("/", $arUrl[0]); $content = file_get_contents($src); $all .= "\n\n" . $content; } } } else { $text = implode(array_map([$script->ownerDocument,"saveHTML"], iterator_to_array($script->childNodes))); $text = mb_convert_encoding($text, "UTF-8", 'HTML-ENTITIES'); $text .= ";"; $all .= "\n\n" . $text . "\n\n"; } if ($is_remove) $remove[] = $script; }
$file_name = "script_" . md5($_SERVER["REQUEST_URI"]) . ".jsgz";
foreach ($remove as $item){ $item->parentNode->removeChild($item); }
file_put_contents($_SERVER["DOCUMENT_ROOT"]."/compress/" . $file_name, gzencode($all));
foreach ($dom->getElementsByTagName("body") as $body){ $element = $dom->createElement('script'); $element->setAttribute('src', "/compress/" . $file_name . "?" . time()); $body->appendChild($element); }
$css = ""; $remove = array(); $file_name_css = "style_" . md5($_SERVER["REQUEST_URI"]) . ".cssgz"; foreach ($dom->getElementsByTagName("link") as $script){ if ($script->getAttribute('href')){ $src = $script->getAttribute('href'); $type = $script->getAttribute('type'); if ($type != "text/css") continue; if (strpos($src, ".cssgz") === false){ if (strpos($src, "http") === false || strpos($src, $domain) !== false){ $arUrl = explode("?", $src); $arPath = explode("/", $arUrl[0]); $arInfo = pathinfo($arUrl[0]); if ($arInfo["basename"]){ $arUrl[0] = str_replace($domain, "", $arUrl[0]); $content = file_get_contents($_SERVER["DOCUMENT_ROOT"].$arUrl[0]); $content = preg_replace(array('/\+/', '/\t+/', '/\n+/'), '', $content); $content = str_replace(array(' '), '', $content); $content = preg_replace('#/\*(?:[^*]*(?:\*(?!/))*)*\*/#', '', $content); $css .= $content; } } else { $arUrl = explode("?", $src); $arPath = explode("/", $arUrl[0]); $content = file_get_contents($src); $content = preg_replace('#/\*(?:[^*]*(?:\*(?!/))*)*\*/#', '', $content); $css .= $content; } } } $remove[] = $script; } foreach ($remove as $item){ $item->parentNode->removeChild($item); } foreach ($dom->getElementsByTagName("head") as $head){ $link = $dom->createElement('link'); $link->setAttribute('href', "/compress/" . $file_name_css . "?" . time()); $link->setAttribute('type', "text/css"); $link->setAttribute('rel', "stylesheet"); $head->appendChild($link); } file_put_contents($_SERVER["DOCUMENT_ROOT"]."/compress/" . $file_name_css, gzencode($css));
$data = $dom->saveHTML(); $data = html_entity_decode($data); echo $data;
<IfModule mod_headers.c> <FilesMatch "\.(jpg|jpeg|png|gif|swf|svg|cssgz|jsgz)$"> Header set Cache-Control "max-age=604800, public" </FilesMatch> <FilesMatch "\.(js|css|swf)$"> Header set Cache-Control "max-age=604800" </FilesMatch> </IfModule> <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/jpeg "access plus 60 day" ExpiresByType image/svg+xml "access plus 60 day" ExpiresByType image/gif "access plus 60 day" ExpiresByType image/png "access plus 60 day" ExpiresByType text/css "access plus 60 day" ExpiresByType application/javascript "access plus 60 day" </IfModule>
Заполняя данную форму вы принимаете условия cоглашения об
использовании
сайта, в том числе в части обработки и использования персональных
данных, а так же политики конфиденциальности