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

33 lines
3.4 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-редиректы
**Дата и время создания:** 02.08.2026 23:45
**Проект:** 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 200 Заглушка)
- **Проблема 404:** Если в шапке/подвале/каталоге есть ссылка на раздел (например, `/vinyl/`), но в базе данных соответствующая статья `TbArticle` со слагом `vinyl` ещё не создана, отдавать честную 404-ошибку вредно для SEO (поисковики штрафуют за битые ссылки с главных страниц).
- **Решение:**
1. Диспетчер ищет `slug` в `TbArticle` (и смежных справочниках).
2. Если статья со слагом не найдена — вместо ответа `404 Not Found` возвращается **HTTP 200 OK** со специальным шаблоном-заглушкой (`hub_placeholder.html`).
3. Для обычного пользователя отображается аккуратная витрина: *"Раздел находится в процессе наполнения"*.
4. Для авторизованного администратора (`request.user.is_staff`) выводится специальное информационное сообщение: *"Настрой, дубинушка, вот такой слаг (`slug`) в админке, и всё починится!"*.
### 1.3. SEO-оптимизация и 301 Permanent Redirects для специализированных разделов
- Если страница найдена по общему роуту `/<slug>/`, но её `l_article_type` указывает на строго профильный раздел (например, `l_article_type == 'blog'` или `l_article_type == 'item'`), и у этой сущности есть свой канонический префиксный путь (например, `/blog/<slug>/` или `/item/<slug>/`):
- Сервер выполняет **HTTP 301 Permanent Redirect** с общего пути `/<slug>/` на канонический адрес `/blog/<slug>/`.
- **Зачем это нужно:**
- Исключает появление дублей страниц в индексе поисковых систем (Яндекс / Google).
- Чётко разграничивает контентные материалы (новости, статьи) и торговые предложения/хабы.