Files
2018-lpon-site/_prj_blueprint/ROUTING.md
T

44 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Архитектурные решения: Роутинг, 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 роут:
```python
path('<slug:slug>/', views.UniversalSlugView.as_view(), name='universal_slug')
```
### 1.2. Обработка отсутствующих слагов: Настоящий HTTP 404 + Подсказка для Админа
- **Проблема Soft 404:** Возврат статуса `200 OK` для несуществующих слагов с заглушкой ("Страница наполняется") вреден для SEO (поисковики индексируют Soft 404 и пессимизируют сайт).
- **Решение:**
1. Диспетчер ищет `slug` в `TbArticle`.
2. Если статья со слагом не найдена ни в основных слагах, ни в истории переименований — сервер **ОБЯЗАТЕЛЬНО возвращает честный статус `HTTP 404 Not Found`**.
3. Для обычного пользователя рендерится аккуратная страница ошибки 404 ("Страница не найдена").
4. Для авторизованного администратора (`request.user.is_staff`) на той же странице 404 выводится специальный информационный блок-подсказка:
> *"Вы вошли как администратор. По адресу `/cassettes/` не найдена статья. Создайте в админке `TbArticle` со слагом `cassettes` (тип HUB), и страница оживёт!"*
### 1.3. Переименование слагов и История Алиасов (HTTP 301 Permanent Redirect)
Возможно овер-кил.
- **Проблема смены слагов:** Если администратор переименует слаг статьи (например, с `cassettes` на `audio-cassettes`), старые внешние ссылки и поисковые индексы выдадут 404.
- **Решение (История слагов):**
1. В `TbArticle` ведётся список прошлых слагов (например, в JSON-метаданных `j_article_metadata['old_slugs']` или отдельной таблице алиасов).
2. Если запрошенный `slug` не найден в основном поле `s_article_slug`, диспетчер проверяет его наличие в истории `old_slugs`.
3. Если слаг найден в истории — сервер мгновенно возвращает **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>/`.
- **Зачем это нужно:**
- Исключает появление дублей страниц в индексе поисковых систем (Яндекс / Google).
- Чётко разграничивает контентные материалы (новости, статьи) и торговые предложения/хабы.