2010-05-18 17 views
33

Estoy tratando de encontrar cómo puedo detectar con JavaScript si estoy en un entorno HTTP o HTTPS.Detectar HTTPS con JavaScript

Llamo a una solicitud de Ajax, así que si estoy en HTTPS y llamo a HTTP Ajax, recibo un 302 Movido temporalmente.

Estaba pensando en obtener el actual window.location.href y hacer una manipulación de cadenas.

¿Cuál es la mejor forma de detectar HTTPS mediante JavaScript?

+0

@DanDascalescu hicieron que utilizó "bandera" para marcar esto como un duplicado? – HackerKarma

+0

@HackerKarma: Yo voté para cerrar hace tres semanas. No pasó nada, y solo entonces usé la bandera. –

+0

@DanDascalescu Gracias. Solo lo señalé para cerrar. Veamos qué pasa. – HackerKarma

Respuesta

39

Puede utilizar la no-estándar

window.location.protocol 

En Firefox: MDC documentation

En IE, parece ser

document.location.protocol 

MSDN documentation

no puedo encontrar información confiable sobre cómo esto se comporta en otros navegadores, pero espero que se adhieran a la cuasi-estándar de document.location.protocol.

Tal vez los jQuery url plugin tipo esto sin tener que lidiar con las diferencias entre navegadores - Nunca he utilizado yo mismo, pero parece prometedor:

jQuery.url.attr("protocol"); 
+0

+1: esa es la forma más genérica :) – Sarfraz

8

location.protocol funciona en todos los navegadores.

+1

Hay más de dos navegadores :) –

+4

¡ay! gracias por devolverme a la realidad :) –

57

En cuanto a la forma en Google Analytics suman su guión a la página:

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 

Entonces document.location.protocol parecería seguro para todos los navegadores.

+0

Gran idea. Funciona perfectamente. – xaragen

0

Hay una lib realmente ordenada llamada URI para cosas como esta. https://github.com/medialize/URI.js

Probablemente no necesite esto solo para obtener el protocolo, pero si va a utilizar URI de manipulación de cadenas, debe usar esto.

5

¿Qué tal esto?

var protocol = window.location.href.indexOf("https://")==0?"https":"http"; 
+0

debe ser protocol = window.location.href.indexOf ("https: //") == 0? "Https": "http"; –

+0

bien, gracias! –

4

En muchos casos, uno puede omitir el protocolo por completo. Así, en lugar de

<img src="https://test.com/image.jpg" /> 

uno podría utilizar

<img src="//test.com/image.jpg" /> 

Entonces el navegador añade el protocolo actual de forma automática. Esto también funciona para incluir archivos en la cabeza, y también debería funcionar para llamadas ajax.

Editar: Hacer esto ahora se considera que es un anti-patrón:

Ahora que SSL se recomienda para todos y no tiene problemas de rendimiento, esta técnica ahora es un anti-patrón. Si el activo que necesita está disponible en SSL, utilice siempre el recurso https: //.

Permitir que el fragmento solicite a través de HTTP abre la puerta a ataques como el reciente ataque Github Man-on-the-side. Siempre es seguro solicitar activos HTTPS incluso si su sitio está en HTTP, sin embargo, lo contrario no es cierto.

véase: http://www.paulirish.com/2010/the-protocol-relative-url/

+0

confirmó que esto funciona para llamadas ajax ... al menos con AngularJS '$ http.get ('// example.com')' – parliament

+3

Una advertencia con la que me encontré es que esta respuesta no funcionará después de implementar el código en un dispositivo móvil (si está usando Cordova o PhoneGap). En ese caso // se resolverá en file: // para que nunca pueda usarlo para llamadas http. Si no está desarrollando para dispositivos móviles, simplemente ignore esto. – parliament

Cuestiones relacionadas