Как правильно настроить RewriteRule для поддомена game.site.com

    При настройке веб-сервера на базе Apache часто возникает задача перенаправить все запросы на поддомене на единый обработчик. В вашем случае домен game.site.com должен корректно обрабатывать URL вида game.site.com, game.site.com/maincraft, game.site.com/maincraft/, game.site.com/maincraft/step1/, а также game.site.com/maincraft/?id=1&g=2 и game.site.com/step1/?id=1&g=2. Проблема возникает из-за неправильного шаблона в правиле RewriteRule, а также из-за отсутствия обработки URL без слэша в конце. Разберём решение по шагам.

    Почему ваше правило не работает?

    Вы используете правило RewriteRule ^(.*)/$ game.php?slug_game=$1 [L,QSA]. Оно срабатывает только для URL, которые заканчиваются на слэш (например, /maincraft/). Для URL без слэша (/maincraft) или корневого адреса (/) правило не применяется. Кроме того, если в URL есть параметры запроса, они могут быть потеряны, если не использовать флаг QSA.

    Правильное решение

    Вам нужно обрабатывать все возможные варианты URL. Лучший способ - использовать одно универсальное правило, которое захватывает путь без слэша и с ним, а также передаёт параметры. Вот оптимальный код для файла .htaccess в корне поддомена:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^game\.site\.com$ [NC]
    RewriteRule ^(.*?)/?$ game.php?slug_game=$1 [L,QSA]

    Это правило работает так: ^(.*?)/?$ - нежадный захват любого пути (включая пустой) и опциональный слэш в конце. Флаг QSA сохраняет все GET-параметры. Таким образом, обрабатываются все указанные вами варианты.

    Обработка корневого URL

    Для корневого адреса game.site.com (без пути) переменная $1 будет пустой. Чтобы это не вызывало ошибок, в скрипте game.php добавьте проверку: если slug_game пуст, загружайте главную страницу игры.

    Дополнительные рекомендации

    • Проверьте порядок правил: Убедитесь, что ваше правило находится до любых других RewriteRule, которые могут перехватывать запросы.
    • Отключите MultiViews: Добавьте Options -MultiViews перед RewriteEngine On, чтобы избежать конфликтов с автоматическим сопоставлением URL.
    • Тестируйте с разными URL: Используйте онлайн-инструменты или локальный сервер для проверки всех вариантов, включая URL с параметрами.

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

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