Настройка принудительного HTTPS-редиректа
HTTPS-редирект гарантирует что все запросы к сайту — включая прямые HTTP-ссылки, закладки, устаревшие ссылки с других сайтов — перенаправляются на HTTPS-версию. HSTS дополнительно защищает от downgrade-атак.
Nginx: редирект HTTP → HTTPS
# Редирект всего HTTP-трафика
server {
listen 80;
listen [::]:80;
server_name example.ru www.example.ru;
# Let's Encrypt .well-known — оставить доступным по HTTP для обновления сертификата
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://example.ru$request_uri;
}
}
# Редирект www → non-www (или наоборот) + HTTPS
server {
listen 443 ssl;
server_name www.example.ru;
ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;
return 301 https://example.ru$request_uri;
}
# Основной сервер
server {
listen 443 ssl http2;
server_name example.ru;
# ...
}
HSTS (HTTP Strict Transport Security)
HSTS сообщает браузеру всегда использовать HTTPS для этого домена — даже если пользователь введёт http://. Браузер кешируется это указание на max-age секунд.
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
-
max-age=63072000— 2 года (рекомендуется после тестирования) -
includeSubDomains— распространить на все поддомены -
preload— для добавления в браузерный preload-лист (hstspreload.org)
Порядок внедрения HSTS:
- Начать с
max-age=300(5 минут) — убедиться что всё работает - Увеличить до
max-age=86400(1 день) - Добавить
includeSubDomains— убедиться что ВСЕ поддомены на HTTPS - Увеличить до
max-age=31536000(1 год) - Добавить
preloadи зарегистрировать на hstspreload.org
Laravel: HTTPS в приложении
// AppServiceProvider
public function boot(): void
{
if (app()->environment('production')) {
URL::forceScheme('https');
// или
URL::forceRootUrl('https://example.ru');
}
}
// bootstrap/app.php — trustProxies для сайтов за reverse proxy/CDN
->withMiddleware(function (Middleware $middleware) {
$middleware->trustProxies(
headers: Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO,
proxies: '*'
);
})
Без trustProxies — Laravel не видит что запрос пришёл по HTTPS (Nginx → PHP по HTTP), генерирует HTTP URL в redirect-заголовках и ссылках.
Apache
# .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Cloudflare
В панели Cloudflare: SSL/TLS → Edge Certificates:
- Always Use HTTPS → включить
- HTTP Strict Transport Security (HSTS) → включить, max-age 12 месяцев
Проверка
# Проверить редирект
curl -I http://example.ru
# Должно вернуть: Location: https://example.ru/
# Проверить HSTS
curl -I https://example.ru | grep Strict
# Должно вернуть: Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
# Полная проверка цепочки редиректов
curl -IL http://www.example.ru
Срок настройки: 30 минут для Nginx-конфигурации и Laravel trustProxies.







