4.6 KiB
4.6 KiB
Архитектурные решения: Роутинг, SEO-редиректы и Обработка Ошибок
Дата и время обновления: 03.08.2026 00:39
Проект: LPON.RU (Django 6.0+, Python 3.12)
Статус: Согласованная архитектура
1. Стратегия Роутинга и SEO
1.1. Плоский единый роутер из корня (/<slug>/)
- Отказываемся от искусственных служебных префиксов в URL (например,
/hub/<slug>/). Все статьи, хабы, музыкальные стили и категории живут на первом уровне:lpon.ru/vinyl/,lpon.ru/cassettes/,lpon.ru/about/. - В
urls.pyв самом конце списка роутов устанавливается универсальный Catch-All роут:path('<slug:slug>/', views.UniversalSlugView.as_view(), name='universal_slug')
1.2. Обработка отсутствующих слагов: Настоящий HTTP 404 + Подсказка для Админа
- Проблема Soft 404: Возврат статуса
200 OKдля несуществующих слагов с заглушкой ("Страница наполняется") вреден для SEO (поисковики индексируют Soft 404 и пессимизируют сайт). - Решение:
- Диспетчер ищет
slugвTbArticle. - Если статья со слагом не найдена ни в основных слагах, ни в истории переименований — сервер ОБЯЗАТЕЛЬНО возвращает честный статус
HTTP 404 Not Found. - Для обычного пользователя рендерится аккуратная страница ошибки 404 ("Страница не найдена").
- Для авторизованного администратора (
request.user.is_staff) на той же странице 404 выводится специальный информационный блок-подсказка:"Вы вошли как администратор. По адресу
/cassettes/не найдена статья. Создайте в админкеTbArticleсо слагомcassettes(тип HUB), и страница оживёт!"
- Диспетчер ищет
1.3. Переименование слагов и История Алиасов (HTTP 301 Permanent Redirect)
Возможно овер-кил.
- Проблема смены слагов: Если администратор переименует слаг статьи (например, с
cassettesнаaudio-cassettes), старые внешние ссылки и поисковые индексы выдадут 404. - Решение (История слагов):
- В
TbArticleведётся список прошлых слагов (например, в JSON-метаданныхj_article_metadata['old_slugs']или отдельной таблице алиасов). - Если запрошенный
slugне найден в основном полеs_article_slug, диспетчер проверяет его наличие в историиold_slugs. - Если слаг найден в истории — сервер мгновенно возвращает HTTP 301 Permanent Redirect на актуальный канонический URL статьи (
/audio-cassettes/).
- В
1.4. SEO-оптимизация и Канонические редиректы для Профильных Разделов
- Если страница найдена по общему роуту
/<slug>/, но еёl_article_typeуказывает на строго профильный раздел (например,l_article_type == 'blog','read'или'item'), и у этой сущности есть свой канонический префиксный путь (например,/read/<slug>/или/item/<slug>/):- Сервер выполняет HTTP 301 Permanent Redirect с общего пути
/<slug>/на канонический адрес/read/<slug>/.
- Сервер выполняет HTTP 301 Permanent Redirect с общего пути
- Зачем это нужно:
- Исключает появление дублей страниц в индексе поисковых систем (Яндекс / Google).
- Чётко разграничивает контентные материалы (новости, статьи) и торговые предложения/хабы.