L'header HSTS (HTTP Strict Transport Security) dice ai browser di connettersi al tuo sito WordPress solo tramite HTTPS. Senza questo header, i visitatori potrebbero accidentalmente arrivare su una versione HTTP non sicura delle tue pagine, rendendoli vulnerabili ad attacchi man-in-the-middle. Una volta impostato, i browser ricordano la tua preferenza e aggiornano automaticamente ogni richiesta a HTTPS per il periodo specificato.
Cosa fa effettivamente l'header HSTS?
Quando un browser riceve l'header Strict-Transport-Security, memorizza queste informazioni localmente. Per ogni visita futura entro la finestra max-age specificata, il browser rifiuterà di connettersi tramite HTTP normale. Non tenta nemmeno prima di stabilire una connessione HTTP; va direttamente a HTTPS. Questo elimina la breve finestra in cui un aggressore può intercettare la richiesta HTTP iniziale e reindirizzare l'utente a una pagina malevola.
L'header ha tre parametri principali:
- max-age: per quanto tempo (in secondi) il browser deve ricordare di forzare HTTPS. Un valore di
31536000corrisponde a un anno. - includeSubDomains: applica la regola anche a ogni sottodominio (es. blog.example.com, shop.example.com).
- preload: segnala che vuoi includere il tuo dominio nella lista HSTS preload integrata del browser, in modo che anche la primissima visita sia protetta.
Prima di iniziare: assicurati che HTTPS funzioni ovunque
Questo passaggio è essenziale. Una volta che HSTS è attivo, i browser non lasciano che i visitatori ricadano su HTTP. Se il tuo certificato SSL è scaduto, configurato male o manca su un sottodominio, quelle pagine diventano completamente irraggiungibili per la durata della tua impostazione max-age. Prima di abilitarlo, verifica quanto segue:
- Il tuo certificato SSL è valido e non sta per scadere.
- Tutte le pagine sul tuo sito si caricano correttamente tramite
https://. - Non ci sono avvisi di mixed content nella console del browser (risorse HTTP caricate su pagine HTTPS).
- Se hai intenzione di usare
includeSubDomains, ogni sottodominio deve avere un certificato valido e fornire contenuti tramite HTTPS. - Il tuo URL del sito WordPress e l'Indirizzo WordPress (in Impostazioni > Generali) usano entrambi
https://.
Aggiungere HSTS tramite Apache .htaccess
Se il tuo sito WordPress gira su Apache (la maggior parte dei provider di hosting condiviso usa Apache), puoi aggiungere l'header direttamente nel file .htaccess nella directory principale di WordPress. Apri il file con un editor di testo o il file manager del tuo provider di hosting, e aggiungi il seguente blocco prima della sezione # BEGIN WordPress:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>Il wrapper IfModule assicura che Apache elabori questa direttiva solo se mod_headers è abilitato. Sulla maggior parte degli host è abilitato di default, ma il wrapper previene un errore 500 sui server dove non è disponibile.
Aggiungere HSTS tramite Nginx
Per l'hosting basato su Nginx (comune negli host WordPress gestiti come Kinsta, Cloudways o SpinupWP), aggiungi l'header all'interno del tuo blocco server. Il file di configurazione si trova tipicamente in /etc/nginx/sites-available/yourdomain.com o in una cartella include Nginx personalizzata offerta dal tuo host:
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# ... rest of your server config
}La parola chiave always alla fine è importante. Senza di essa, Nginx invia l'header solo nelle risposte di successo (2xx). Con always, viene incluso anche nelle pagine di errore (4xx, 5xx), che è il comportamento corretto per gli header di sicurezza.
Dopo aver modificato la configurazione, testa e ricarica Nginx:
sudo nginx -t
sudo systemctl reload nginxAggiungere HSTS tramite PHP in functions.php
Se non hai accesso ai file di configurazione del server (alcuni host gestiti lo limitano), puoi inviare l'header da PHP. Aggiungi quanto segue al file functions.php del tuo tema attivo, o meglio, a un plugin specifico per il sito in modo che sopravviva agli aggiornamenti del tema:
function iwp_add_hsts_header() {
if ( ! is_admin() ) {
header( 'Strict-Transport-Security: max-age=31536000; includeSubDomains; preload' );
}
}
add_action( 'send_headers', 'iwp_add_hsts_header' );Tieni presente che gli header basati su PHP si applicano solo alle pagine elaborate da WordPress. I file statici (immagini, CSS, JS) serviti direttamente da Apache o Nginx non portano questo header. Per una copertura completa, l'approccio a livello di server è sempre migliore.
Usare un plugin WordPress per impostare HSTS
Se preferisci un approccio no-code, diversi plugin possono gestire HSTS per te:
- Really Simple SSL (Pro): la versione Pro include un modulo per gli header di sicurezza con cui puoi abilitare HSTS e configurare
max-ageeincludeSubDomainsdal dashboard. - HTTP Headers: un plugin gratuito che ti offre una UI per impostare vari header di sicurezza, incluso Strict-Transport-Security.
- Headers Security Advanced & HSTS WP: costruito appositamente per gli header di sicurezza con un semplice interruttore per HSTS e preload.
I plugin sono comodi, ma aggiungono una dipendenza extra. Se il plugin viene disattivato o rimosso, anche i tuoi header scompaiono. Per qualcosa di fondamentale come HSTS, una configurazione a livello di server è più affidabile.
Strategia di rollout sicura: iniziare piccolo, poi aumentare
Passare direttamente a un max-age di un anno è rischioso se non hai testato tutto. Se qualcosa va storto, i browser continueranno a forzare HTTPS per un anno intero, e non c'è modo di "annullare" l'header dal lato server una volta che un browser l'ha memorizzato nella cache. Segui invece questo approccio graduale:
- 5 minuti: imposta
max-age=300e naviga il tuo sito. Verifica che ogni pagina si carichi, che i moduli vengano inviati correttamente e che non appaiano avvisi di mixed content. - 1 giorno: aumenta a
max-age=86400. Lascialo funzionare per un giorno o due monitorando il tuo sito. - 1 settimana: passa a
max-age=604800. A questo punto dovresti essere in grado di fidarti che HTTPS funzioni ovunque. - 1 anno: imposta il valore finale di
max-age=31536000. Questo è il minimo richiesto per l'invio alla lista HSTS preload. - Aggiungi includeSubDomains: fallo solo quando è confermato che tutti i sottodomini funzionano su HTTPS.
- Aggiungi preload: aggiungi il flag
preloade invia il tuo dominio su hstspreload.org.
Inviare il tuo sito alla lista HSTS preload
La lista HSTS preload è un registro di domini che vengono distribuiti con i browser con applicazione HSTS integrata. Questo significa che anche la primissima visita al tuo sito avviene tramite HTTPS, prima che il browser abbia mai visto il tuo header. Per essere idoneo, il tuo sito deve soddisfare questi requisiti:
- Fornire un certificato SSL valido.
- Reindirizzare tutto il traffico HTTP a HTTPS sullo stesso host.
- Inviare l'header
Strict-Transport-Securitycon unmax-agedi almeno31536000(un anno). - Includere la direttiva
includeSubDomains. - Includere la direttiva
preload.
Visita hstspreload.org, inserisci il tuo dominio e invia. Tieni presente che la rimozione dalla lista preload richiede mesi e un ciclo di aggiornamento del browser, quindi invia solo quando ti impegni completamente con HTTPS.
Come verificare il tuo header HSTS con i DevTools del browser
Dopo aver aggiunto l'header, puoi confermare rapidamente che funzioni:
- Apri il tuo sito in Chrome o Firefox.
- Premi F12 per aprire i DevTools.
- Vai alla scheda Network e ricarica la pagina.
- Clicca sulla richiesta del documento principale (di solito la prima).
- Scorri verso il basso fino a Response Headers.
- Cerca
Strict-Transport-Security. Dovresti vedere il valore configurato.
Puoi anche controllare dalla riga di comando:
curl -sI https://example.com | grep -i strict-transportSe l'header non appare, controlla di visitare la versione HTTPS (non HTTP) e che le modifiche alla configurazione del server siano state salvate e ricaricate.
Errori comuni HSTS e come evitarli
- Impostare HSTS sulle risposte HTTP: l'header viene ignorato dai browser quando viene fornito tramite HTTP normale. Ha effetto solo sulle risposte HTTPS.
- Dimenticare i file statici: se imposti HSTS tramite PHP, i file statici bypassano WordPress e non portano l'header. Usa la configurazione a livello di server per copertura completa.
- Usare includeSubDomains senza controllare i sottodomini: se hai un sottodominio che non supporta HTTPS (es. un vecchio server di staging), diventa inaccessibile.
- Saltare troppo rapidamente a un max-age lungo: inizia sempre con una durata breve e accumula lentamente.
- Dimenticare di rinnovare il tuo certificato SSL: con HSTS attivo e un certificato scaduto, il tuo sito è completamente irraggiungibile. Imposta il rinnovo automatico con Let's Encrypt o il tuo provider di certificati.
Verifica la tua configurazione HSTS con InspectWP
Dopo aver aggiunto l'header, esegui una nuova scansione InspectWP sul tuo sito. La sezione header di sicurezza nel tuo report mostra lo stato dell'header Strict-Transport-Security. Se tutto è configurato correttamente, apparirà come verde (presente). Se hai impostato anche altri header di sicurezza, controlla anche quelli per ottenere un quadro completo dello stato di sicurezza del tuo sito.