Оптимізація SEO для мультиязичного сайту (hreflang audit)
Мультиязичний сайт без правильно налаштованого hreflang — джерело систематичних SEO-проблем. Google показує російську версію німецьким користувачам, англійська сторінка ранжирується в Україні замість української, дублюючи переводи з'їдають crawl budget. Hreflang — це атрибут, який сообщает поисковику: "для користувачів з мовою X та регіоном Y користуй цю версію сторінки".
Синтаксис hreflang
<link rel="alternate" hreflang="ru" href="https://example.com/ru/about/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/about/" />
<link rel="alternate" hreflang="uk" href="https://example.com/uk/about/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/about/" />
Три місці для розміщення:
-
<head>кожної сторінки - HTTP
Link:заголовок (для PDF, non-HTML) - XML Sitemap
Критичне правило: hreflang повинен бути взаємним. Якщо сторінка A посилається на B через hreflang, B обов'язано посилатися назад на A.
Поширені помилки
1. Відсутність самоссилки. Кожна сторінка повинна містити hreflang на саму себе:
<!-- На /ru/about/ -->
<link rel="alternate" hreflang="ru" href="https://example.com/ru/about/" />
<!-- + посилання на всі інші мовні версії -->
2. Неправильні коди мов. Використовується ISO 639-1 (мова) та ISO 3166-1 alpha-2 (регіон):
ru → російська (без регіону)
ru-RU → російська, Росія
uk → українська
en-US → англійська, США
en-GB → англійська, Велика Британія
3. Змішування www/non-www, http/https. Повинна відповідати canonical версії.
4. hreflang на noindex-сторінки. Google рекомендує цього не робити.
Аудит: виявлення помилок
Screaming Frog: Crawl → Reports → Hreflang → перевірити missing return links та неправильні коди.
Python-скрипт для валідації:
import requests
from bs4 import BeautifulSoup
from collections import defaultdict
def fetch_hreflang(url: str) -> dict:
try:
resp = requests.get(url, timeout=10)
soup = BeautifulSoup(resp.text, 'html.parser')
links = soup.find_all('link', rel='alternate')
return {
link.get('hreflang'): link.get('href')
for link in links
if link.get('hreflang')
}
except:
return {}
def audit_hreflang(urls: list[str]) -> list[dict]:
hreflang_map = {}
errors = []
for url in urls:
hreflang_map[url] = fetch_hreflang(url)
for url, alternates in hreflang_map.items():
for lang, alt_url in alternates.items():
if lang == 'x-default':
continue
if alt_url not in hreflang_map:
errors.append({
'type': 'missing_page',
'source': url,
'target': alt_url
})
continue
target_alternates = hreflang_map.get(alt_url, {})
back_links = [v for v in target_alternates.values() if v == url]
if not back_links:
errors.append({
'type': 'missing_return_link',
'source': url,
'target': alt_url
})
return errors
Перевірка через GSC: Search Console → International Targeting → Language показує помилки hreflang виявлені Googlebot.
Hreflang у Sitemap
Для великих сайтів (1000+ сторінок) утримувати hreflang в кожному <head> складно. Використовувати sitemap:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/ru/about/</loc>
<xhtml:link rel="alternate" hreflang="ru" href="https://example.com/ru/about/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/about/"/>
<xhtml:link rel="alternate" hreflang="uk" href="https://example.com/uk/about/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/about/"/>
</url>
</urlset>
x-default використання
x-default вказує сторінку для користувачів чия мова/регіон не співпадає ні з одним hreflang. Використовується для:
- Сторінки вибору мови
- Англійська як дефолтна для невідомих ринків
- Можна пропустити якщо немає нейтральної версії
Структури URL для мультиязичних сайтів
| Структура | Приклад | SEO |
|---|---|---|
| Поддомен | ru.example.com | Чистіше розділення, складніше |
| Підпапка | example.com/ru/ | Простіше, ділить авторитет домену |
| ccTLD | example.ru | Сильний геосигнал, дорого |
Підпапка (/ru/, /en/) — рекомендується для більшості проектів.
Тривалість
Аудит hreflang на існуючому сайті (до 5 мов, 500 сторінок) — 2–3 дні: краулинг, аналіз помилок, звіт. Виправлення + налаштування автогенерації в шаблоні/sitemap — 3–5 днів. Повторна перевірка через 4 тижні — включена.







