WebDir — это полноценный, production-ready скрипт веб-каталога (web directory) на чистом PHP 8.2+ без лишних зависимостей. Современный glassmorphism-дизайн, тёмная и светлая темы, адаптивный интерфейс, мощная админ-панель, REST API, полнотекстовый поиск — всё готово к установке и работе. Идеально подходит как самостоятельный проект, так и как основа для собственного сервиса.
Архитектура и технологии
PHP 8.4 — строгая типизация, современный синтаксис, именованные аргументы
Собственный MVC-фреймворк — никакой зависимости от Laravel/Symfony/Yii, только нужный код
Feature-based архитектура — модульная структура, каждый функциональный блок изолирован
Принципы SOLID, DRY, KISS — чистый, читаемый, легко расширяемый код
MySQL 8+ / MariaDB 10.5+ — FULLTEXT-индексы для поиска, оптимизированные составные индексы
Redis / файловый кэш — переключается одной строкой в .env
Twig 3 — безопасный шаблонизатор с автоэкранированием XSS
Docker — готовый docker-compose.yml для локальной разработки (nginx + php-fpm + mysql + redis + phpmyadmin)
Полный список функций
Пользователи и авторизация
Функция
Описание
Регистрация
Форма с валидацией, проверка уникальности username и email
Подтверждение email
Отправка письма со ссылкой, токен с хешированием SHA-256
Авторизация
Логин по email + пароль, bcrypt (cost 12)
«Запомнить меня»
Безопасный cookie-токен на 30 дней
Сброс пароля
Отправка письма, одноразовый токен, TTL 1 час
Профиль пользователя
Аватар (загрузка + GD-ресайз до 200×200), биография, ссылка на сайт
Смена пароля
С проверкой текущего пароля
Роли
user / moderator / admin с разными правами доступа
Блокировка аккаунта
Бан с указанием причины, автоматический выход заблокированного пользователя
Мои сайты
Список добавленных сайтов с фильтрацией по статусу
Мои отзывы
История оставленных отзывов с возможностью удаления
Каталог сайтов
Функция
Описание
Добавление сайтов
Форма с полным описанием, краткой аннотацией, тегами, SEO-полями
Скриншоты
Загрузка и авторесайз (GD) до 1200×675, WebP/PNG/JPG/GIF
Favicon
Автоматическое получение через Google Favicons API, локальное хранение
Категории
Двухуровневые вложенные категории с иконками (emoji), счётчиком сайтов
Теги
До 10 тегов на сайт, облако тегов с весами, автообновление счётчиков
Статусы сайтов
pending → active / rejected / inactive
Модерация
Ручная модерация с указанием причины отклонения, уведомление автора на email
Переход через /go/{id} с подсчётом кликов, дедупликация по IP (1 час)
Просмотры
Подсчёт уникальных просмотров, дедупликация по IP (30 минут)
Рекомендуемые
Флаг is_featured, управление из админки
Продвижение
Флаг is_promoted с датой окончания, поднятие в топ списка
SEO-поля
Meta Title, Meta Description для каждого сайта
Похожие сайты
Автоматический блок «Похожие» по категории
Поиск
Функция
Описание
Полнотекстовый поиск
MySQL FULLTEXT BOOLEAN MODE по title + description + short_description
Boolean режим
Автоматическое добавление +word* для AND-логики и префиксного поиска
Живые подсказки
AJAX-автокомплит с debounce 300мс, навигация стрелками
История поиска
Сохранение в localStorage, быстрый повтор запроса
Подсветка результатов
Подсветка совпадений прямо в карточках результатов
Фильтрация
По категории, сортировка (релевантность / новые / рейтинг / популярные)
Популярные запросы
Автоматический сбор статистики, виджет популярных тегов и запросов
Лог поиска
Запись всех запросов с количеством результатов для аналитики
Рейтинги и отзывы
Функция
Описание
Оценка 1–5 звёзд
Интерактивный UI, только авторизованные пользователи
Один отзыв на сайт
Защита от дублирования на уровне БД (UNIQUE KEY user_id + site_id)
Антиспам
Максимум 5 отзывов с одного IP в сутки через кэш
Текст отзыва
От 10 до 1000 символов, валидация
Пересчёт рейтинга
Автоматическое обновление rating_avg и ratings_count после каждого отзыва
Удаление отзывов
Автором или модератором
Модерация отзывов
Статусы pending / approved / rejected
Статистика и аналитика
Функция
Описание
Просмотры сайта
Ежедневная статистика в таблице site_stats
Клики
Трекинг переходов с дедупликацией
График для владельца
Chart.js-график просмотров/кликов за 30 дней прямо на странице сайта
Аналитика для админа
Отдельная страница /admin/stats:
— Трафик всего каталога за 30 дней (график)
— Топ-10 сайтов по просмотрам
— Распределение сайтов по категориям (progress bars)
— Популярные поисковые запросы
— Регистрации пользователей за 14 дней (столбчатый график)
Счётчики дашборда
Всего сайтов, активных, на модерации, пользователей, отзывов, суммарные просмотры/клики
Админ-панель
Раздел
Возможности
Дашборд
Виджеты с ключевыми метриками, последние сайты и пользователи, топ по просмотрам
Модерация сайтов
Вкладки по статусу (ожидают/активные/отклонённые/все), поиск, одобрение одним кликом, отклонение с причиной в модальном окне, значок в навигации с количеством ожидающих
Все сайты
Поиск, фильтры по статусу, управление featured/promoted, удаление
Пользователи
Поиск, фильтр по роли, смена роли через AJAX-select, бан/разбан с причиной
Категории
Редактирование дерева категорий в реальном времени, создание/редактирование/удаление, drag-образный интерфейс с вложенностью
Настройки
Название сайта, описание, email, meta keywords, количество элементов на странице, режим модерации (ручная/авто), включение/отключение регистрации
Аналитика
Полная страница статистики с Chart.js-графиками
REST API v1
Полноценный API с JWT-аутентификацией:
POST /api/v1/auth/login → Получить JWT токен
POST /api/v1/auth/refresh → Обновить токен (auth)
GET /api/v1/me → Профиль текущего пользователя (auth)
GET /api/v1/sites → Список сайтов (фильтры: category_id, tag, sort, featured; пагинация)
GET /api/v1/sites/search?q= → Полнотекстовый поиск
GET /api/v1/sites/{slug} → Данные сайта + теги + favicon/screenshot URLs
POST /api/v1/sites → Создать сайт (auth)
PUT /api/v1/sites/{id} → Обновить сайт (auth, owner/moderator)
DELETE /api/v1/sites/{id} → Удалить сайт (auth, owner/moderator)
GET /api/v1/categories → Дерево категорий
GET /api/v1/categories/{id} → Категория + breadcrumb + дочерние
GET /api/v1/sites/{id}/reviews → Отзывы сайта (пагинация)
POST /api/v1/sites/{id}/reviews → Добавить отзыв (auth)
DELETE /api/v1/reviews/{id} → Удалить отзыв (auth, owner/moderator)
Все ответы в JSON. Rate limiting 60 запросов/минуту. Стандартизированные коды ошибок.
Email-уведомления
Подтверждение регистрации — HTML-письмо с кнопкой верификации
Сброс пароля — безопасная ссылка с TTL
Сайт одобрен — уведомление автора с прямой ссылкой
Сайт отклонён — уведомление с причиной
Все шаблоны в glassmorphism-стиле, адаптивная верстка
Поддержка любого SMTP (Mailtrap, SendGrid, Mailgun, Яндекс, Gmail и др.)
Режим log для разработки (без отправки, запись в лог)
Безопасность
Защита
Реализация
XSS
Twig auto-escape + htmlspecialchars везде
SQL-инъекции
PDO prepared statements, нет конкатенации в запросах
CSRF
Токены на всех POST-формах, middleware-проверка, X-CSRF-TOKEN заголовок для AJAX
Брутфорс
Rate limiter: 60 req/min глобально, класс RateLimiter для логина
Пароли
bcrypt, cost 12
Remember-me
SHA-256 хеш токена в БД, httpOnly + SameSite=Lax cookie
JWT
HMAC-SHA256, configurable TTL
Загрузки
Проверка MIME через finfo, ограничение по расширению и размеру
Путь к файлам
Проверка через realpath() для endpoint /storage/
Security Headers
X-Frame-Options, X-Content-Type-Options, X-XSS-Protection в .htaccess и nginx