HSTS e doppio reindirizzamento


9

Gestisco un piccolo sito Web in un ambiente LAMP di hosting condiviso: questo in pratica significa che l'unica cosa che posso modificare è un file htaccess.

Volevo aggiungere il supporto HSTS (e l'ho fatto), ma, quando ho testato il mio sito Web qui per l'idoneità al precarico HSTS, ho ricevuto il seguente errore:

Errore: HTTP reindirizza prima a www

http://example(HTTP) dovrebbe immediatamente reindirizzare a https://example(HTTPS) prima di aggiungere il sottodominio www. Al momento, il primo reindirizzamento è https://www.example.Il reindirizzamento aggiuntivo è necessario per garantire che qualsiasi browser che supporti HSTS registri la voce HSTS per il dominio di primo livello, non solo per il sottodominio.

Quindi, suppongo che dovrei reindirizzare gli utenti in questo modo:

  1. http://example (questo è ciò che l'utente inserisce nella barra degli indirizzi del suo browser)
  2. https://example (lo reindirizziamo alla versione HTTPS del sito Web)
  3. https://www.example (lo reindirizziamo di nuovo al sottodominio www)

Il mio attuale reindirizzamento viene eseguito in questo modo:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Ho provato ad aggiungere un reindirizzamento prima dell'ultima riga, in questo modo:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

ma ho ricevuto un errore "la pagina non reindirizza correttamente" dal browser.

Quindi, qual è il modo corretto di reindirizzare un utente dalla versione http del sito Web a https e infine a https con www? E: ci sono dei rischi?

Risposte:


10

Come indicato nei requisiti di invio dell'elenco di precaricamento HSTS :

  1. Reindirizzare da HTTP a HTTPS sullo stesso host, se si sta ascoltando sulla porta 80.

Devi reindirizzare allo stesso host (ad es. HTTP_HOST), Non semplicemente al example.comprimo. Non è necessario reindirizzare a example.comse l'utente richiede www.example.comdirettamente. (Il test comporterà una richiesta a example.com.) Successivamente, è possibile reindirizzare al sottodominio www canonico, se necessario.

Ho provato ad aggiungere un reindirizzamento prima dell'ultima riga, in questo modo:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Ciò creerebbe un ciclo di reindirizzamento, perché la RewriteConddirettiva precedente si applica solo alla prima RewriteRule, quindi la seconda RewriteRuleverrebbe eseguita incondizionatamente.

Prova invece qualcosa di simile al seguente:

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

La HTTP_HOSTvariabile del server contiene il valore dell'intestazione della Hostrichiesta HTTP (cioè qualunque host venga richiesto).

Il 2o reindirizzamento indica ... per tutte le richieste in cui l'host richiesto non si avvia, www.quindi prefisso www.l'host. Tuttavia, ciò potrebbe non essere accettabile se si hanno più sottodomini (che si risolvono nello stesso posto) che si desidera mantenere separati, poiché verranno naturalmente reindirizzati al sottodominio www.

Si noti che si tratta di 302 reindirizzamenti (temporanei). Passa a 301 solo quando sei sicuro che funzioni correttamente.

E: ci sono dei rischi?

Nessun rischio Sì, ci sono potenzialmente due reindirizzamenti mentre in precedenza poteva essercene solo uno (che è probabilmente meno efficiente). Ma ci sono ancora solo due reindirizzamenti, il che è perfettamente OK per il SEO. Inoltre, con HSTS, l'utente-agente sperimenterà il doppio reindirizzamento al massimo una sola volta.


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

A parte: (Ignorando HSTS per il momento ...) Questo non sarebbe stato completo da solo, in quanto non può canonicalizzare una richiesta per https://example.com/...(es. HTTPS e apice di dominio).


Ulteriori letture:


Grazie mille, lo proverò presto. Una rapida risposta al lato finale: quello funziona comunque ma sembra che sia qualcosa che non posso controllare direttamente (non nel file htaccess, almeno: c'è un pannello di reindirizzamento nel gestore del sito Web del provider di hosting)

1
A proposito, la tua soluzione funziona PERFETTAMENTE! :-)

1
"pannello di reindirizzamento nel gestore del sito Web del provider di hosting" - Sarei sempre diffidente nei confronti di tali strumenti. Ad esempio, la sezione dei reindirizzamenti in cPanel è molto limitata e piuttosto nota.
MrWhite,

1
Questo dipende da come stai impostando l' Strict-Transport-Securityintestazione della risposta. Ad esempio, per impostarlo sul reindirizzamento dovrai usare l' alwaysargomento sulla Headerdirettiva. Ho risposto a una domanda correlata sullo stack di Pro Webmasters (salta la prima parte della mia risposta su on/ off) che fornisce maggiori dettagli sull'implementazione del " precarico HSTS " in .htaccess.
MrWhite,

1
Prego. Ad essere onesti, lo stack Pro Webmasters è probabilmente più adatto a .htaccessdomande relative solo (ServerFault presume che tu abbia il pieno controllo del server, nel qual caso non lo faresti .htaccess). È senza dubbio più semplice implementarlo nella configurazione del server usando <VirtualHost>contenitori separati (poiché non è necessario fare confusione con le variabili ambientali e le condizioni aggiuntive - è "più pulito" e meno soggetto a errori). Non credo che consiglierei l'invio della "lista di precaricamento" se si ha accesso solo a .htaccess. (My 2c)
MrWhite,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.