Как настроить 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.

    Альтернативный подход: единое правило

    Можно объединить обработку категории и статьи в одно правило с необязательным вторым сегментом, но это усложняет логику и может вызвать конфликты. Рекомендуется использовать явные правила выше - они проще для понимания и отладки.

    Часто задаваемые вопросы