33 lines
3.4 KiB
Markdown
33 lines
3.4 KiB
Markdown
# Архитектурные решения: Роутинг, 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).
|
||
- Чётко разграничивает контентные материалы (новости, статьи) и торговые предложения/хабы.
|
||
|