Налаштування примусового HTTPS-редиректа
HTTPS-редирект гарантує що всі запити до сайту — включаючи прямі HTTP-посилання, закладки, застарілі посилання з інших сайтів — перенаправляються на HTTPS-версію. HSTS додатково захищає від downgrade-атак.
Nginx: редирект HTTP → HTTPS
# Редирект всього HTTP-трафіку
server {
listen 80;
listen [::]:80;
server_name example.ua www.example.ua;
# Let's Encrypt .well-known — залишити доступним по HTTP для оновлення
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://example.ua$request_uri;
}
}
# Редирект www → non-www (або навпаки) + HTTPS
server {
listen 443 ssl;
server_name www.example.ua;
ssl_certificate /etc/letsencrypt/live/example.ua/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ua/privkey.pem;
return 301 https://example.ua$request_uri;
}
# Основний сервер
server {
listen 443 ssl http2;
server_name example.ua;
# ...
}
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
HTTPS в Laravel застосунку
// AppServiceProvider
public function boot(): void
{
if (app()->environment('production')) {
URL::forceScheme('https');
// або
URL::forceRootUrl('https://example.ua');
}
}
// 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.ua
# Має повернути: Location: https://example.ua/
# Перевірити HSTS
curl -I https://example.ua | grep Strict
# Має повернути: Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
# Повна перевірка ланцюга редиректів
curl -IL http://www.example.ua
Строки налаштування: 30 хвилин для Nginx-конфігурації та Laravel trustProxies.







