From f3186ff28f7c3ef78b4029df25c4ec8e4a6f8dd2 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 3 Aug 2026 00:38:25 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D0=B4=D0=BE=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D1=80=D0=BE=D1=83=D1=82=D0=B8=D0=BD=D0=B3=D1=83=20(=D0=B4?= =?UTF-8?q?=D1=80=D0=B0=D1=84=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _prj_blueprint/ROUTING.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 _prj_blueprint/ROUTING.md diff --git a/_prj_blueprint/ROUTING.md b/_prj_blueprint/ROUTING.md new file mode 100644 index 0000000..867ea10 --- /dev/null +++ b/_prj_blueprint/ROUTING.md @@ -0,0 +1,32 @@ +# Архитектурные решения: Роутинг, SEO-редиректы + +**Дата и время создания:** 02.08.2026 23:45 +**Проект:** LPON.RU (Django 6.0+, Python 3.12) +**Статус:** Согласованная архитектура + +--- + +## 1. Стратегия Роутинга и SEO + +### 1.1. Плоский единый роутер из корня (`//`) +- Отказываемся от искусственных служебных префиксов в URL (например, `/hub//`). Все статьи, хабы, музыкальные стили и категории живут на первом уровне: `lpon.ru/vinyl/`, `lpon.ru/cassettes/`, `lpon.ru/about/`. +- В `urls.py` в самом конце списка роутов устанавливается универсальный Catch-All роут: + ```python + path('/', 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 для специализированных разделов +- Если страница найдена по общему роуту `//`, но её `l_article_type` указывает на строго профильный раздел (например, `l_article_type == 'blog'` или `l_article_type == 'item'`), и у этой сущности есть свой канонический префиксный путь (например, `/blog//` или `/item//`): + - Сервер выполняет **HTTP 301 Permanent Redirect** с общего пути `//` на канонический адрес `/blog//`. +- **Зачем это нужно:** + - Исключает появление дублей страниц в индексе поисковых систем (Яндекс / Google). + - Чётко разграничивает контентные материалы (новости, статьи) и торговые предложения/хабы. +