Как настроить .htaccess для ЧПУ (SEO-friendly URL)?php-38

Человеко-понятные URL (ЧПУ) критически важны для SEO и удобства пользователей. Вот профессиональная настройка .htaccess для их реализации.

Базовый вариант для ЧПУ

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Исключаем реальные файлы и директории
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # Перенаправляем все запросы на index.php
    RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
</IfModule>

Расширенная настройка с примерами

1. Для типичного MVC-фреймворка

Options +FollowSymLinks -Indexes
RewriteEngine On

# Редирект с www на без www (или наоборот)
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]

# Редирект с HTTP на HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ЧПУ для страниц
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

# Кеширование статики
<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
    Header set Cache-Control "max-age=31536000, public"
</FilesMatch>

2. Для конкретных маршрутов

# Категории товаров
RewriteRule ^catalog/([a-z0-9-]+)/?$ catalog.php?category=$1 [NC,L]

# Товары
RewriteRule ^product/([a-z0-9-]+)/([0-9]+)/?$ product.php?slug=$1&id=$2 [NC,L]

# Статьи
RewriteRule ^blog/([0-9]{4})/([0-9]{2})/([a-z0-9-]+)/?$ article.php?year=$1&month=$2&slug=$3 [NC,L]

3. Дополнительные оптимизации

# Удаление слеша в конце URL
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L]

# Удаление дублирующихся слешей
RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]

# Блокировка вредоносных ботов
RewriteCond %{HTTP_USER_AGENT} (badbot1|badbot2) [NC]
RewriteRule .* - [F,L]

# Запрет доступа к скрытым файлам
RewriteRule ^\.git - [F,L]

Обработка в PHP

<?php
// Получаем URL
$url = $_GET['url'] ?? 'home';

// Разбиваем URL на части
$params = explode('/', trim($url, '/'));

// Маршрутизация
$controller = $params[0] ?? 'home';
$action = $params[1] ?? 'index';
$id = $params[2] ?? null;

// Пример обработки
switch ($controller) {
    case 'product':
        showProduct($action); // $action будет ID продукта
        break;
    case 'blog':
        showBlogPost($action); // $action будет slug поста
        break;
    default:
        showHomePage();
}

Важные нюансы

  1. Кодировка URL:
    Используйте [B] флаг для автоматического декодирования URL:
    RewriteRule ^shop/(.*)$ shop.php?query=%1 [B,NE,L]

  2. Регистр букв:
    Флаг [NC] делает сравнение без учета регистра

  3. Конечные слеши:
    Унифицируйте - либо всегда добавляйте, либо всегда удаляйте

  4. Кеширование правил:
    Добавьте в начало:
    FileETag MTime Size
    ExpiresActive On

Тестирование правил

Используйте онлайн-валидаторы или команду:
curl -I http://yourdomain.com/your-url

Резюмируем:

  • Включите mod_rewrite через RewriteEngine On
  • Исключите реальные файлы и директории
  • Используйте флаги [L] (last), [QSA] (query string append)
  • Настройте редиректы для HTTPS и www
  • Реализуйте логику маршрутизации в PHP
  • Оптимизируйте URL для SEO (латинские буквы, дефисы вместо подчеркиваний)

Пример полного .htaccess:
https://example.com/htaccess-full-example