Rileva HTTP o HTTPS, quindi forza HTTPS in JavaScript


298

Esiste un modo per rilevare HTTP o HTTPS e quindi forzare l'utilizzo di HTTPS con JavaScript?

Ho alcuni codici per rilevare l'HTTP o l'HTTPS ma non posso forzarlo https:.

Sto usando la proprietà window.location.protocol per impostare qualunque sia il sito per https:aggiornare la pagina e, si spera, ricaricare un nuovo URL https caricato nel browser.

if (window.location.protocol != "https:") {
   window.location.protocol = "https:";
   window.location.reload();
}

15
Questo è un lato server gestito in modo molto più affidabile (ed efficiente).
Quentin,

3
Penso che tu abbia ragione. Come attaccante che utilizza un attacco MITM, potrei semplicemente eliminare questo codice. Quindi offre solo protezione contro gli attacchi passivi.
ndevln,


1
@NeoDevlin un attaccante MITM su http può sostituire anche un reindirizzamento lato server
Alex Lehmann

1
Esattamente. Nel 2018 non ci sono scuse per non usare HSTS. Questo è l'unico modo sicuro per forzare HTTPS.

Risposte:


501

Prova questo

if (location.protocol !== 'https:') {
    location.replace(`https:${location.href.substring(location.protocol.length)}`);
}

location.href = blahaggiunge questo reindirizzamento alla cronologia del browser. Se l'utente preme il pulsante Indietro, verrà reindirizzato alla stessa pagina. È meglio usare location.replacein quanto non aggiunge questo reindirizzamento alla cronologia del browser.


3
Perché windowe no document?
webjay


11
Il confronto delle stringhe dovrebbe essere !==?
Wes Turner,

5
@WesTurner Non dovrebbe importare in nessun modo. Entrambi saranno sempre delle stringhe. Se uno fosse un numero o un valore booleano, allora potrebbe fare la differenza.
Soumya,

15
location.replace(url)sarebbe molto meglio che location.href = urlper questo caso. Non vuoi che questo reindirizzamento nella cronologia del browser o che l'utente prema il pulsante Indietro solo per essere reindirizzato di nuovo.
Francisco Zarabozo,

59

L'impostazione di location.protocol passa a un nuovo URL . Non è necessario analizzare / tagliare nulla.

if (location.protocol !== "https:") {
  location.protocol = "https:";
}

Firefox 49 ha un bug dove httpsfunziona ma https:non lo fa. Ha detto di essere risolto in Firefox 54 .


2
if window.location.href.match('http:') window.location.href = window.location.href.replace('http', 'https')funziona su FF e Chrome più recenti.
Martin Stannard il

2
location.protocol = "https";sembra funzionare anche se in Firefox 28
Nick Russler

1
Merda che rompe il pulsante indietro. Usa location.replaceinvece.
Warlike Chimpanzee,

22

Non è una buona idea perché devi solo reindirizzare temporaneamente l' utente su https e il browser non salva questo reindirizzamento.

Descrivi l'attività per web server (apache, nginx ecc.) Http 301, http 302


3
essere d'accordo. Forzare https sul server è molto più affidabile
Hoàng Long,

3
Potrei vederlo in uso se è importante preservare il valore di hash. Non viene inviato al server e alcuni browser non lo conservano.
Jason Rice,

Ecco un link a Set Azure Web Site solo per https ... blogs.msdn.com/b/benjaminperkins/archive/2014/01/07/…
OzBob

1
Non necessariamente vero. C'è una scuola di pensiero che 301 è il diavolo per motivi di cache. getluky.net/2010/12/14/301-redirects-cannot-be-undon
fivedogit

2
Mentre è vero che in genere non è una buona idea fare questo lato client, non è quello che è stato chiesto. E non mostri come farlo, quindi questa non è una risposta. Inoltre, in questi giorni di pagine Web statiche, spesso non c'è modo di fare questo lato server (pensa alle pagine di Github), il che significa che devi farlo sul client. Tuttavia, puoi aiutare a migliorare la ricerca aggiungendo tag di collegamento canonici per evitare che le persone colpiscano la versione non ssl.
oligofren,

16

Cosa ne pensi di questo?

if (window.location.protocol !== 'https:') {
    window.location = 'https://' + window.location.hostname + window.location.pathname + window.location.hash;
}

Idealmente, lo faresti sul lato server, però.


manca il porto
eadmaster il

13
if (location.protocol == 'http:')
  location.href = location.href.replace(/^http:/, 'https:')

5

Non è un modo Javascript per rispondere a questa domanda, ma se usi CloudFlare puoi scrivere regole di pagina che reindirizzano l'utente molto più velocemente su HTTPS ed è gratuito. Sembra così nelle regole della pagina di CloudFlare:

inserisci qui la descrizione dell'immagine


In realtà l'ho trovato molto utile, non per rispondere alla domanda come inquadrata, ma per fornire informazioni utili su un modo forse più affidabile per un servizio SaaS che non offre SSL sempre attivo.
MrMesees,

3

Tu puoi fare:

  <script type="text/javascript">        
        if (window.location.protocol != "https:") {
           window.location.protocol = "https";
        }
    </script>

Funziona. È un modo standard per reindirizzare? funzionerà in tutti i browser?
Mahfuz,



0

Mi piacciono le risposte a questa domanda. Ma per essere creativo, vorrei condividere un altro modo:

<script>if (document.URL.substring(0,5) == "http:") {
            window.location.replace('https:' + document.URL.substring(5));
        }
</script>

0

if (str.indexOf('https') === -1) {
  str = str.replace('http', 'https')
}


2
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Donald Duck

-1
<script type="text/javascript">
        function showProtocall() {

            if (window.location.protocol != "https") {
                window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
                window.location.reload();
            }
        }
        showProtocall();
</script>

-1

Ciao ho usato questa soluzione funziona perfettamente. Non c'è bisogno di controllare, basta usare https.

<script language="javascript" type="text/javascript">
document.location="https:" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
</script>

3
questo non aggiorna la pagina anche se il protocollo è https?
Anthony,

-2

Ho appena avuto tutte le varianti di script testate da Pui Cdm , incluse le risposte sopra e molte altre usando php, htaccess, configurazione del server e Javascript, i risultati sono che lo script

<script type="text/javascript">        
function showProtocall() {
        if (window.location.protocol != "https") {
            window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
            window.location.reload();
        }
    }
    showProtocall();
</script> 

fornito da vivek-srivastava funziona meglio e puoi aggiungere ulteriore sicurezza nello script java.

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.