Vai al contenuto

I visitatori passano per più reindirizzamenti prima della pagina

Avviso Intero dominio Sicurezza

Istruzioni generali. Aprite questo articolo dal vostro report PageCheck per vederlo compilato con le catene di reindirizzamenti trovate sul sito e la regola per il vostro hosting (Cloudflare, Plesk, cPanel, Apache o nginx).

Che cos’è

Un sito web ha quattro indirizzi radice: con e senza www, via http:// e via https://. I visitatori digitano uno qualsiasi di essi, i vecchi link e i risultati di ricerca puntano a uno qualsiasi di essi. Solo uno serve la pagina; gli altri tre dovrebbero inviarvi il visitatore con un solo reindirizzamento permanente (301), direttamente all'indirizzo https:// e mai attraverso http:// lungo il percorso.

Ogni reindirizzamento in più è un viaggio completo di andata e ritorno verso il server prima ancora che la pagina possa iniziare a caricarsi, e Google ne chiede al massimo uno. Un salto da https:// a http:// mette chi visita il sito per la prima volta su una connessione non cifrata che chiunque sulla stessa rete può leggere o dirottare.

Cosa non va

Uno o più indirizzi radice richiedono due o più reindirizzamenti per raggiungere la pagina, passano per http:// non cifrato lungo il percorso, usano un reindirizzamento temporaneo, finiscono su un altro sito web o non raggiungono mai una pagina.

Come correggere

1. Decidete l'unico indirizzo finale e assicuratevi che HTTPS funzioni su ogni nome. La pagina è servita a https://example.com, quindi è l'indirizzo a cui devono puntare tutti gli altri. Prima di aggiungere un reindirizzamento, aprite https:// sull'altro nome (www.example.com) in un browser: non deve mostrare alcun avviso sul certificato. I certificati di Let's Encrypt e di Cloudflare coprono entrambi i nomi quando entrambi sono elencati; se ne manca uno, aggiungetelo prima al certificato, altrimenti ogni reindirizzamento da quel nome inizierà con un avviso.

2. Impostate un solo reindirizzamento permanente da ogni altro indirizzo radice direttamente a quello finale. Usate la regola per il punto in cui il vostro sito risponde (il vostro hosting può dirvelo): una sola regola che gestisce schema e www nello stesso passaggio, non due regole una dopo l'altra. Usate un 301, mai un 302 o 307, e mantenete il percorso e la query string.

Apache o LiteSpeed (anche hosting Plesk e cPanel con Apache): nel file .htaccess nella cartella principale del sito, sopra la riga «# BEGIN WordPress»

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]

nginx: i blocchi server del sito

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.example.com;
    # the certificate must cover www.example.com
    return 301 https://example.com$request_uri;
}

Cloudflare, se il sito è dietro di esso: Rules → Redirect Rules → Create rule

When incoming requests match (custom filter expression):
    http.host eq "www.example.com"

Then: Dynamic redirect, status code 301, preserve query string:
    concat("https://example.com", http.request.uri.path)
  • Plesk: Websites & Domains → Hosting Settings: impostate «Preferred domain» sulla forma scelta (https://example.com) e spuntate «Permanent SEO-safe 301 redirect from HTTP to HTTPS». Plesk manda allora ogni altro indirizzo radice a quello finale in un solo passaggio.
  • cPanel: Domains → Redirects: un reindirizzamento permanente (301) con wildcard dall'altro nome all'indirizzo finale, «Redirect with or without www», oppure la regola .htaccess qui sopra.
  • Se una CDN o un bilanciatore di carico termina l'HTTPS davanti al server, il server vede solo http:// e la regola .htaccess qui sopra va in loop. Verificate l'intestazione «X-Forwarded-Proto» invece di %{HTTPS}, oppure impostate il reindirizzamento sulla CDN come con Cloudflare.
  • Rimuovete poi ogni altra regola di reindirizzamento per questi indirizzi (un vecchio plugin «forza HTTPS», un secondo reindirizzamento del pannello di controllo): sono due regole a produrre due salti.

3. Dite ai browser di usare https:// fin dall'inizio. Quando https:// funziona su entrambi i nomi, inviate l'intestazione Strict-Transport-Security: max-age=31536000; includeSubDomains su entrambi. Un browser che ha visitato il sito una volta non prova più http://, così il salto http:// sparisce per i visitatori che tornano. Aggiungete «preload» e inviate il dominio a hstspreload.org solo quando ogni sottodominio funziona in HTTPS.

4. Verifica. Chiedete a ogni indirizzo radice la sua prima risposta: tutti tranne l'indirizzo finale devono rispondere 301 con l'indirizzo finale in «location», e l'indirizzo finale deve rispondere 200:

In un terminale

curl -sI http://www.example.com/ | grep -i '^HTTP\|^location'
curl -sI https://www.example.com/ | grep -i '^HTTP\|^location'
curl -sI http://example.com/ | grep -i '^HTTP\|^location'
curl -sI https://example.com/ | grep -i '^HTTP\|^location'

Poi eseguite di nuovo questo controllo: segue tutti e quattro gli indirizzi ed elenca ogni salto.

Make every root address of my website reach the page in one permanent redirect: http://www.example.com/, https://www.example.com/ and http://example.com/ must each answer 301 straight to https://example.com (same path and query), never via http:// on the way, and https://example.com/ must answer 200.
The site is not known to be behind a CDN.

Steps:
1. Make sure the certificate covers example.com and www.example.com (no warning on https:// for either name).
2. Replace all existing redirect rules for these addresses with ONE rule that handles scheme and host in the same step: on Cloudflare a Single Redirect `http.host eq "www.example.com"` → `concat("https://example.com", http.request.uri.path)` (301, preserve query string) with Always Use HTTPS left on; on Apache/LiteSpeed a RewriteCond %{HTTPS} off [OR] / RewriteCond %{HTTP_HOST} ^www\.example\.com$ / RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L] block above # BEGIN WordPress; on nginx a port-80 server block for both names and a port-443 block for www.example.com, each `return 301 https://example.com$request_uri;`. Behind a TLS-terminating proxy test X-Forwarded-Proto, not %{HTTPS}.
3. Remove the other rules (control panel redirects, force-HTTPS / force-www plugins) so no address takes two hops.
4. Send `Strict-Transport-Security: max-age=31536000; includeSubDomains` on both names once https:// works on both.
5. Verify with curl -sI on all four root addresses: three answer 301 with location https://example.com/… in one hop, the final one 200; show me the output.
Tell me exactly which files or settings you changed.

Resources:
- Google Search Central, redirects and Google Search: https://developers.google.com/search/docs/crawling-indexing/301-redirects
- Cloudflare, Single Redirects: https://developers.cloudflare.com/rules/url-forwarding/single-redirects/

Controlla il tuo sito per sapere se ha questo problema. Controlla un sito