Генератор hreflang
Вставьте пары язык–URL, выберите x-default и получите проверенный набор hreflang в виде тегов <link rel="alternate">, записей xhtml:link для карты сайта и HTTP-заголовка Link. Проверяет коды языка по ISO 639-1, письменности по ISO 15924 и региона по ISO 3166-1, ловит en-uk, коды без языка и трёхбуквенные коды, повторяющиеся теги, относительные URL и отсутствие x-default — каждая страница перечисляет весь набор, обратные ссылки гарантированы. Работает в браузере, ничего не сохраняется.
Замечания (1)
- СправкаВ наборе 2 разных хостов. Для ccTLD-схем это нормально; проверьте, что это не опечатка.
Набор
| hreflang | Язык | Письменность | Регион | URL |
|---|---|---|---|---|
de | de | — | — | https://www.example.com/de/ |
en | en | — | — | https://www.example.com/ |
en-GB | en | — | GB | https://www.example.co.uk/ |
ja | ja | — | — | https://www.example.com/ja/ |
ru | ru | — | — | https://www.example.com/ru/ |
x-default | по умолчанию | — | — | https://www.example.com/ |
Вывод — один и тот же набор на каждой странице
<link rel="alternate" hreflang="de" href="https://www.example.com/de/" />
<link rel="alternate" hreflang="en" href="https://www.example.com/" />
<link rel="alternate" hreflang="en-GB" href="https://www.example.co.uk/" />
<link rel="alternate" hreflang="ja" href="https://www.example.com/ja/" />
<link rel="alternate" hreflang="ru" href="https://www.example.com/ru/" />
<link rel="alternate" hreflang="x-default" href="https://www.example.com/" />Вставьте без изменений в <head> каждого URL из набора. Каждая страница перечисляет все альтернативы, включая себя, — именно это делает обратные ссылки полными.
Проверка и генерация выполняются в браузере — ни один запрос не покидает страницу, ничего не сохраняется. Коды языка, письменности и региона сверяются с ISO 639-1, ISO 15924 и ISO 3166-1; инструмент сообщает, что нашёл, и не решает, какому рынку нужна страница.
Как это работает
1. По одной записи на строку — языковой тег и абсолютный URL в любом порядке, разделённые запятой, табуляцией, точкой с запятой, вертикальной чертой или пробелом; строки, начинающиеся с #, игнорируются; строка x-default необязательна 2. Каждый тег разбивается на язык, письменность и регион (подчёркивания считаются дефисами), регистр нормализуется: язык строчными (ru), письменность с заглавной (Hant), регион ПРОПИСНЫМИ (GB) 3. Части проверяются — язык по ISO 639-1 (две буквы; iw/in/ji/mo помечаются как устаревшие), письменность по ISO 15924, регион по ISO 3166-1 alpha-2; en-uk, регион без языка (us) и трёхбуквенные коды (eng) отклоняются с указанием причины 4. Проверяются URL — абсолютные с http или https, разбираемые, без повторяющихся тегов между строками; один URL под двумя тегами допустим, но помечается, фрагмент (#) помечается 5. Определяется x-default: явная строка имеет приоритет, иначе — строка, выбранная в списке; более одного x-default — ошибка, отсутствие — предупреждение; весь набор с x-default в конце и есть выходной набор 6. Один и тот же набор выводится один раз на страницу: строки <link rel="alternate" hreflang="…" href="…"> для <head>, блок <url> карты сайта с записями xhtml:link для каждого URL и HTTP-заголовок Link для не-HTML документов — поскольку каждая страница несёт полный набор, каждая ссылается на все остальные, и обратные ссылки не могут отсутствовать
О hreflang и о том, что проверяет генератор
hreflang сообщает Google и Яндексу, для какого языка и, при необходимости, региона предназначена страница и где находится её эквивалент для другой аудитории. Это аннотация, а не редирект: поисковая система по-прежнему ранжирует ту страницу, которую ранжирует, но когда конкурируют несколько версий, она может подставить ту, что соответствует языку и стране пользователя. Bing и большинство других поисковиков игнорируют hreflang и вместо этого читают атрибут lang в HTML и заголовок content-language, поэтому hreflang дополняет эти сигналы, а не заменяет их.
Тег — это код языка по ISO 639-1 (две буквы, то есть en, а не eng), за которым могут следовать письменность по ISO 15924 (zh-Hant, sr-Latn) и регион по ISO 3166-1 alpha-2 (en-GB, pt-BR). Порядок важен, как и справочники: Великобритания — это GB, а не UK; регион не может стоять отдельно; тег вроде es-419 (Латинская Америка) — код области по классификации ООН M.49, который Google не принимает. Генератор нормализует регистр, который поисковые системы допускают, и отклоняет части, которые просто неверны и молча игнорируются.
Правило, которое ломает большинство внедрений, — взаимность: если страница A указывает на страницу B как на немецкую версию, B должна указывать обратно на A, и каждая страница набора обязана перечислять все остальные, включая себя. Отсутствующая обратная ссылка заставляет Google игнорировать аннотацию с обеих сторон. Генератор обходит проблему по построению — он выводит один и тот же полный набор для каждой страницы, так что ошибиться можно, только вставив другой набор на другую страницу. x-default называет страницу для посетителей, чей язык не совпадает ни с чем в наборе, — обычно это выбор языка или основной язык; он необязателен, но без него это решение остаётся за поисковой системой.
Три способа размещения делают одно и то же, и нужен только один: теги <link> в <head>, записи xhtml:link в XML-карте сайта (лучший вариант для больших сайтов, где править шаблоны постранично непрактично, а карта сайта уже генерируется) или HTTP-заголовок Link — единственный вариант для PDF и других не-HTML файлов. В любом случае URL должны быть абсолютными и каноническими: hreflang, указывающий на перенаправляемый или неканонический URL, отбрасывается. Генератор сообщает о том, что нашёл; заслуживает ли рынок собственной страницы — решение, которое он не принимает.
Частые вопросы
- Нужен ли x-default?
- Он необязателен, но рекомендуется, когда набор не покрывает все языки, которые могут быть у посетителя. x-default называет URL, который показывается, если ни один из перечисленных языков не подходит, — обычно страницу выбора языка или страницу на основном языке. Генератор предупреждает, если его нет, и позволяет выбрать любую строку как x-default; явная строка x-default во вводе имеет приоритет над списком.
- Почему en-uk отклоняется?
- Потому что код Великобритании по ISO 3166-1 — GB. en-uk — самая распространённая опечатка в hreflang; Google не угадывает, а просто игнорирует тег. Замечание показывает исправленную форму en-GB, чтобы вы поправили источник.
- Можно ли использовать язык без региона и регион сам по себе?
- Язык сам по себе (de) допустим и соответствует всем говорящим по-немецки независимо от страны. Регион сам по себе (de в значении «Германия» или us) недопустим — hreflang всегда начинается с языка. Чтобы нацелиться именно на Германию, используйте de-DE; на немецкоговорящих в Швейцарии — de-CH.
- Проблема ли, если два языка указывают на один URL?
- Нет. Одна страница может обслуживать несколько тегов — en и en-US на одном URL или испанская страница для es, es-ES и es-MX — при условии, что каждый тег встречается один раз. Генератор помечает общий URL как справку, чтобы вы подтвердили намерение, но включает оба тега в вывод.
- Что означает «отсутствуют обратные ссылки» в Search Console и предотвращает ли это инструмент?
- Это значит, что страница A аннотирует страницу B, но B не аннотирует A. Каждая страница набора должна нести весь набор, включая ссылку на себя. Этот генератор выводит один и тот же полный блок для каждого URL, поэтому при вставке как есть отсутствующая обратная ссылка невозможна; ошибка появляется, только если страницы позже редактируются по отдельности или один из URL набора перенаправляет.
- Куда ставить hreflang — в HTML, карту сайта или HTTP-заголовок?
- Выберите один вариант. Теги <link> в HTML проще всего для небольших сайтов; записи xhtml:link в карте сайта лучше масштабируются и не трогают шаблоны; HTTP-заголовок Link — единственный вариант для не-HTML файлов вроде PDF. Использовать несколько размещений можно, но любое расхождение между ними считается ошибкой, так что это удваивает поддержку без выгоды.
- Использует ли Bing hreflang?
- Bing заявляет, что определяет язык и рынок страницы по атрибуту lang в HTML, мета-тегу или HTTP-заголовку content-language и структуре URL, а не по hreflang. Google и Яндекс читают hreflang. Задайте и то и другое: hreflang для Google и Яндекса и корректный атрибут lang для всех остальных.