Как настроить 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 для эмуляции разных браузеров.