Как настроить HTTP и HTTPS для старых браузеров

    Ситуация: у сайта есть SSL-сертификат, и вы хотите, чтобы посетители с современными браузерами автоматически перенаправлялись с HTTP на HTTPS. Однако старые браузеры (например, Internet Explorer на Windows XP) не поддерживают HTTPS, и им нужно оставить доступ по HTTP. При этом контент на HTTP и HTTPS может различаться. В этой статье объясняем, как реализовать такую схему с помощью серверных настроек.

    Почему это сложно сделать стандартными средствами?

    Обычные редиректы (301 или 302) с HTTP на HTTPS не учитывают возможности браузера. Если настроить глобальное перенаправление, то пользователь старого браузера попадёт на HTTPS и увидит ошибку соединения. Нужен более гибкий подход, который анализирует User-Agent или использует JavaScript для проверки поддержки протокола.

    Решение через JavaScript на стороне клиента

    Самый простой способ - разместить на HTTP-версии сайта скрипт, который проверяет, может ли браузер открыть HTTPS-ссылку. Если да - выполняется перенаправление, если нет - пользователь остаётся на HTTP.

    Пример кода для проверки

    <script>
    if (window.location.protocol !== 'https:') {
      var img = new Image();
      img.onload = function() { window.location = 'https://' + window.location.host + window.location.pathname; };
      img.onerror = function() { /* остаёмся на HTTP */ };
      img.src = 'https://' + window.location.host + '/1x1.png?' + Math.random();
    }
    </script>

    Этот метод работает, но имеет недостаток: задержка из-за загрузки изображения. Для критически важных страниц лучше использовать серверный вариант.

    Серверный подход с Nginx

    Можно настроить Nginx так, чтобы он проверял User-Agent и для старых браузеров не делал редирект, а отдавал HTTP-версию. Пример конфигурации:

    server {
        listen 80;
        server_name example.com;
        
        if ($http_user_agent ~* "MSIE [1-9]\.|Trident/7\.0") {
            # Старый браузер - отдаём HTTP
            return 200;
            # или proxy_pass на HTTP-бэкенд
        }
        
        # Все остальные - редирект на HTTPS
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl;
        server_name example.com;
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
        # ... остальная конфигурация
    }

    Важно: условие if в Nginx может быть ненадёжным для сложных правил, поэтому для продакшена рекомендуется использовать карту (map) или модуль ngx_http_browser_module.

    Серверный подход с Apache

    В Apache можно использовать mod_rewrite и mod_setenvif для проверки User-Agent:

    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_USER_AGENT} !"MSIE [1-9]\." [NC]
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    Это правило перенаправляет на HTTPS всех, кроме браузеров Internet Explorer версий 1-9. Для старых браузеров запрос обрабатывается как обычно, по HTTP.

    Дублирование контента и SEO

    Если на HTTP и HTTPS разный контент, поисковые системы могут посчитать это дублированием. Чтобы избежать санкций, используйте тег <link rel="canonical"> на обеих версиях, указывая предпочтительный URL (обычно HTTPS). Также добавьте в robots.txt запрет индексации HTTP-версии, если она служит только для старых браузеров.

    Проверка работы

    После настройки протестируйте:

    • Современный браузер (Chrome, Firefox) при вводе http:// должен перейти на https://
    • Старый браузер (IE8 на виртуальной машине) должен остаться на http://
    • Проверьте, что HTTPS-версия загружается без ошибок сертификата

    Используйте инструменты вроде curl с подменой User-Agent для эмуляции разных браузеров.

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