Как подставить дефолтное значение параметра в URL через .htaccess
Веб-мастера часто сталкиваются с задачей: если в запросе отсутствует определённый GET-параметр (например, utm_source или page), нужно автоматически перенаправить пользователя на тот же URL, но с этим параметром, установленным по умолчанию. В Apache это можно реализовать с помощью директив RewriteCond и RewriteRule в файле .htaccess. Разберём, как настроить такое перенаправление.
Базовая логика проверки отсутствующего параметра
Чтобы определить, что конкретная переменная (например, utm_source) не задана или пуста, используйте условие RewriteCond с проверкой строки запроса %{QUERY_STRING}. Если условие выполняется - применяется правило редиректа.
Пример: подставить значение по умолчанию для параметра «utm_source»
Допустим, вы хотите, чтобы при отсутствии utm_source в URL он автоматически становился равным organic. Правило будет выглядеть так:
RewriteEngine On
RewriteCond %{QUERY_STRING} !(^|&)utm_source=[^&] [NC]
RewriteRule ^(.*)$ /$1?utm_source=organic [R=301,L,QSA]Пояснение: RewriteCond проверяет, что в строке запроса (%{QUERY_STRING}) нет вхождения utm_source= с любым значением (кроме пустого). Флаг QSA (Query String Append) сохраняет все остальные переданные параметры. В итоге, если пользователь заходит на site.ru/?page=1, он будет перенаправлен на site.ru/?page=1&utm_source=organic.
Обработка пустого значения параметра
Иногда параметр присутствует, но его значение пусто (например, ?utm_source=&page=2). В этом случае условие нужно изменить, чтобы проверять не только отсутствие, но и пустоту:
RewriteCond %{QUERY_STRING} !(^|&)utm_source=[^&]+ [NC]
RewriteRule ^(.*)$ /$1?utm_source=organic [R=301,L,QSA]Здесь [^&]+ требует, чтобы после знака равно был хотя бы один символ, не являющийся амперсандом. Если параметр пуст или отсутствует - сработает редирект.
Особенности при большом количестве параметров
Если в URL может быть произвольное число параметров (N может меняться), описанные выше правила работают корректно благодаря флагу QSA. Он добавляет новые параметры к уже существующим, не удаляя старые. Главное - убедиться, что правило не зациклится: после первого редиректа параметр по умолчанию уже будет присутствовать, поэтому условие RewriteCond перестанет выполняться.
Ограничения и альтернативы
Метод с .htaccess прост, но не всегда гибок. Если нужно подставлять разные дефолтные значения для разных параметров, придётся писать отдельные пары RewriteCond/RewriteRule для каждого случая. Для более сложной логики (например, подстановка на основе пользовательских данных) лучше использовать серверный язык (PHP, Python) - он даёт полный контроль над обработкой запроса.
Проверка и отладка
После внесения изменений в .htaccess обязательно протестируйте правило:
- Перейдите по URL без нужного параметра - должно сработать перенаправление (код 301).
- Перейдите по URL с уже заданным параметром - редиректа быть не должно.
- Проверьте, что остальные GET-параметры сохранились.
Для отладки включите RewriteLog в конфигурации Apache или используйте онлайн-инструменты для проверки регулярных выражений.