URL-структура и ЧПУ
Проектируем URL так, чтобы они были понятны человеку, поисковику и не плодили дубли.
ЧПУ (человекопонятный URL) — адрес из читаемых слов, отражающий содержимое и иерархию страницы:
/tutorials/seo/canonical, а не/page?id=8472&cat=3.
Почему URL важен для SEO
URL — это и сигнал ранжирования (слова в адресе подсказывают тему), и элемент сниппета (пользователь видит путь под заголовком), и каркас навигации. Хороший URL читается вслух и понятен без открытия страницы.
| Плохо | Хорошо |
/p?id=8472&c=3 | /tutorials/seo/canonical |
/Article_Final_NEW.html | /journal/kak-rabotaet-https |
/products/category/12/item/99 | /shop/keyboards/mx-keys |
URL живёт дольше страницы
Важная для разработчика мысль: URL — это долгосрочный контракт. На него ставят внешние ссылки, его сохраняют в закладки, он накапливает поисковый вес годами. Поэтому проектировать структуру адресов стоит на вырост, а менять — только при крайней необходимости и обязательно с 301-редиректом. Частая ошибка — зашивать в URL то, что меняется: дату (/2024/...), технологию (/wordpress/...), временную категорию. Когда это устареет, вы окажетесь перед выбором: жить с нелогичным адресом или ломать ссылки переездом. Лучше сразу закладывать стабильную иерархию, основанную на смысле, а не на сиюминутных деталях реализации.
Правила хорошего слага
- Латиница, нижний регистр, дефисы как разделители:
web-vitals, неWeb_Vitals. - Транслит или перевод кириллицы:
kak-ubrat-dubli(URL-кодированная кириллица читается людьми, но выглядит уродливо в ссылках). - Коротко и по делу: ключевое слово есть, мусорных «и», «как», «the» — минимум.
- Иерархия отражает структуру:
/категория/подкатегория/страница. - Стабильность: URL не должен меняться без необходимости — каждое изменение требует 301-редиректа.
Опасность параметров и регистра
Одна и та же страница, доступная по разным URL, — это дубли, которые дробят сигналы и тратят бюджет краулинга. Классические источники дублей:
/shop/keyboards и /shop/keyboards/ (слэш в конце)
/Shop/Keyboards и /shop/keyboards (регистр)
/shop/keyboards?ref=tg и /shop/keyboards (utm/ref-метки)
/shop/keyboards?sort=price&sort=name (порядок параметров)
Лечится это canonical (следующий раздел) и нормализацией URL на сервере: единый регистр, единая политика по завершающему слэшу, 301 с дублей на канон.
Как работает под капотом: генерация слага
Слаг генерируется из заголовка: приводим к нижнему регистру, заменяем пробелы дефисами, выкидываем мусорные символы. Базовая реализация:
import re
def slugify(title):
s = title.lower().strip()
# кириллицу для примера переводим простой таблицей
table = {"а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","и":"i",
"к":"k","л":"l","н":"n","о":"o","р":"r","с":"s","т":"t",
"у":"u","ь":"","я":"ya"," ":"-"}
s = "".join(table.get(ch, ch) for ch in s)
s = re.sub(r"[^a-z0-9-]", "", s) # оставляем только латиницу, цифры, дефис
s = re.sub(r"-+", "-", s).strip("-") # схлопываем повторы дефисов
return s
print(slugify("Как убрать дубли"))
print(slugify("Core Web Vitals 2024!!!"))
Вывод:
kak-ubrat-dubli core-web-vitals-2024
Частые ошибки
- ID вместо слов:
/page?id=42ничего не говорит ни человеку, ни поиску. - Меняющиеся URL без 301 — потеря накопленных позиций и битые ссылки.
- Дубли из-за регистра/слэша/меток без нормализации и canonical.
- Слишком глубокая вложенность:
/a/b/c/d/e/page— и людям сложно, и сигнал «страница далеко от корня».
Итог
- ЧПУ читаемы людьми и поисковиком: латиница, дефисы, ключевое слово, отражённая иерархия.
- Один контент по разным URL — это дубли; нормализуйте регистр, слэш и метки.
- URL должны быть стабильны; любое изменение сопровождайте 301-редиректом.