Как настроить htaccess для ЧПУ category/slug на поддомене
При разработке сайта часто возникает задача преобразовать человекопонятные URL (ЧПУ) вида https://articles.site.com/category/slug/ в реальный путь к скрипту, например articles.php?category=categ_name&slug=title_slug. В этой статье мы подробно разберём корректное правило для файла .htaccess, которое работает на поддомене и учитывает доступность корневой страницы и страницы категории.
Почему ваш код не работает?
Исходная попытка содержала ошибки в регулярном выражении и неправильную логику захвата параметров. Выражение ^(.*)?([a-z0-9-_]+)([a-z0-9-_]+)$ пытается захватить два сегмента, но не учитывает слэши и структуру URL. Кроме того, условия для корневого адреса и страницы категории не были прописаны отдельно.
Корректное правило htaccess для поддомена
Предположим, что поддомен articles.site.com указывает на директорию, где лежит articles.php. Тогда в корневой .htaccess этой директории нужно добавить следующий код:
RewriteEngine On
# 1. Пропускаем реально существующие файлы и папки
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 2. Доступ к корню поддомена
RewriteRule ^$ articles.php [L,QSA]
# 3. Доступ к странице категории (например, /category/)
RewriteRule ^([a-z0-9_-]+)/$ articles.php?category=$1 [L,QSA]
# 4. Доступ к статье (например, /category/slug/)
RewriteRule ^([a-z0-9_-]+)/([a-z0-9_-]+)/$ articles.php?category=$1&slug=$2 [L,QSA]Объяснение правил
Проверка на существующие файлы
Первые две строки RewriteCond гарантируют, что правило не сработает для реально существующих файлов (изображений, CSS, JS) и папок, что предотвращает ошибки.
Корневой адрес
Правило ^$ соответствует пустому пути (то есть https://articles.site.com/) и направляет его на articles.php без параметров. Если нужно открывать другую страницу (например, index.html), измените цель.
Страница категории
Правило ^([a-z0-9_-]+)/$ захватывает одно слово (латиница, цифры, дефис, подчёркивание), за которым следует слэш. Это позволяет обрабатывать URL вида /category/ и передавать имя категории в параметр category.
Страница статьи
Правило ^([a-z0-9_-]+)/([a-z0-9_-]+)/$ захватывает два сегмента, разделённых слэшем, и передаёт их как category и slug. Оба параметра экранируются амперсандом в коде, но в .htaccess используется просто & (или & в зависимости от сервера).
Важные нюансы
- Регистр символов: в примере используются только строчные буквы. Если нужна поддержка заглавных, добавьте флаг
NC(No Case) в конец каждого RewriteRule:[L,QSA,NC]. - Завершающий слэш: все правила ожидают слэш в конце URL. Если пользователь введёт адрес без слэша, можно добавить отдельный редирект для добавления слэша с помощью
RewriteRule ^([a-z0-9_-]+)$ $1/ [R=301,L]. - Флаг QSA: позволяет добавить существующие query-параметры к новому URL. Если они не нужны, используйте только
[L]. - Тестирование: всегда проверяйте правила на тестовом сервере или локально, так как ошибка в htaccess может привести к 500 Internal Server Error.
Альтернативный подход: единое правило
Можно объединить обработку категории и статьи в одно правило с необязательным вторым сегментом, но это усложняет логику и может вызвать конфликты. Рекомендуется использовать явные правила выше - они проще для понимания и отладки.