Как настроить редирект с http на https для всего сайта, кроме админки

    При переходе сайта на HTTPS часто возникает задача оставить часть ресурсов, например, административную панель, работающей по HTTP. Это может быть связано с несовместимостью устаревших систем с защищённым протоколом. В этой статье мы разберём, как правильно настроить редирект с http на https в файле .htaccess, исключив из перенаправления админпанель, и избежать циклического перенаправления.

    Проблема циклического редиректа при исключении админки

    Стандартные правила RewriteRule часто приводят к бесконечному циклу, когда браузер пытается перейти на HTTPS, затем возвращается на HTTP, и так повторяется. Это происходит из-за того, что условия проверяются не в правильном порядке, или исключение не обрабатывается до основного редиректа.

    Рабочий код .htaccess для разграничения протоколов

    Чтобы гарантированно направить весь сайт на HTTPS, кроме URL с префиксом /admin/, используйте следующий проверенный код:

    RewriteEngine On
    
    # Исключение для админки - не перенаправлять на HTTPS
    RewriteCond %{HTTPS} =on
    RewriteCond %{REQUEST_URI} ^/admin/
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    # Основной редирект на HTTPS для всех остальных страниц
    RewriteCond %{HTTPS} =off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    Пояснение логики работы

    • Первое правило: если включён HTTPS и запрос начинается с /admin/, выполняется редирект на HTTP (код 301).
    • Второе правило: если HTTPS выключен (и не определён через прокси), все остальные страницы перенаправляются на HTTPS.
    • Порядок правил критичен: исключение обрабатывается раньше основного редиректа, что предотвращает цикл.

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

    Перед применением проверьте, что ваш хостинг поддерживает RewriteEngine и модуль mod_rewrite. Если админка использует абсолютные ссылки на HTTP, убедитесь, что они не переопределяются через HTTPS. Также рекомендуется очистить кэш браузера и использовать инструменты типа curl -I для тестирования редиректов.

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

    Почему возникает циклическое перенаправление?

    Цикл появляется, когда условие исключения проверяется после основного редиректа на HTTPS. Браузер перенаправляет на HTTPS, затем условие для админки не срабатывает, и снова идёт редирект на HTTP - и так бесконечно. Решение - ставить исключение первым.

    Нужно ли учитывать прокси-серверы?

    Да, если сайт работает через обратный прокси (например, Cloudflare), используйте %{HTTP:X-Forwarded-Proto} для корректного определения протокола. В противном случае достаточно проверки %{HTTPS}.

    Можно ли использовать код 302 вместо 301?

    Для постоянного редиректа (SEO) используйте 301. Для временного тестирования - 302. В нашем примере код 301 уместен, так как это окончательное решение.

    Как проверить, что редирект работает правильно?

    Используйте команду curl -I http://my.site.ru - должен вернуться статус 301 с Location на HTTPS. Для админки curl -I http://my.site.ru/admin/ - статус 200 OK, без перенаправления.

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